2016-12-09 8 views
0

私は、それ自身の上に配列を指定の長さに追加する関数を作った。私が抱えている唯一の問題は、配列が奇数、例えば9で、長さが20になるようにしようとしているときに、最後に2つのゼロが出力されるということです。私は配列がすべてのバイトを埋めるようにする方法があると確信しています。指定された長さの配列の上に配列を追加する

現在の機能:バイト

byte[] Block = new byte[0x10] { 0x02, 0x03, 0xFF, 0x04, 0x61, 0x37, 0x5f, 0xe8, 0x19, 0x70, 0xa2, 0x77, 0x8c, 0x94, 0x89, 0xb4 }; 

public static byte[] AppendToLen(byte[] input, int length) 
{ 
    byte[] output = new byte[length]; 
    if (length <= input.Length) return null; 
    for (int i = 0; i < length/input.Length; i++) 
     Array.Copy(input, 0, output, input.Length * i, input.Length); 
    return output; 
} 

ブロックの例は以下のとおりです。

foreach(byte bit in AppendToLen(Block, 56)) { 
    Console.WriteLine(bit.ToString("X2")); 
} 

Ouput: 0203FF0461375FE81970A2778C9489B40203FF0461375FE81970A2778C9489B40203FF0461375FE81970A2778C9489B40000000000000000 

答えて

2

上記の例では、length/input.Lengthという用語が2に切り下げられているため、2回だけ反復しています。これは整数除算であることに注意してください。また、配列の終わりから離れないように注意してください。以下のスニペットはあなたが望むことをします。

public static byte[] AppendToLen(byte[] input, int length) 
    { 
     byte[] output = new byte[length]; 
     if (length <= input.Length) return null; 
     // Just use offset here since that's what you care about 
     for (int offset = 0; offset < length; offset += input.Length) 
      // Copy as much of the input array as possible to the output, 
      // starting at this iteration's offset 
      Array.Copy(input, 0, output, offset, Math.Min(length - offset, input.Length)); 
     return output; 
    } 
+0

素晴らしい、魅力のように動作します。ありがとうございました。 –

1

問題は、あなたは残りのバイトに任意の値を代入していないということです。あなたの例では、56%16 = 8なので、ループの後ろには、初期化せずに8バイトが残っています。さて、あなたが入力配列の最初の8バイトを使って、わからないものを埋める方法です。その場合は、余りが> 0かどうかを調べるためにループの後に余分なチェックを追加し、それらの8(余り)バイトを配列の最後の位置にコピーする必要があります。

+0

私はあなたが言っていることを得ています。それ以外の部分はBlockCopyで試してみて、それがどこにあるのか見てみることができます。 –

関連する問題