0

任意の長さの byte[] 配列があり、それを部分に分割したいのですが、各部分の長さは 2205 で、それらの 2205 バイトに対して操作を行う必要があります。これが私のアルゴリズムです。

// SPLIT BY 2205 Bytes
int block = 2205;
int counter = 0;
byte[] to_Send = new byte[block];
foreach (byte b in ARCHIEVE_BUFFER)
{
    if (counter < 2205)
    {
        to_Send[counter] = b;
        counter++;
    }
    else if (counter == 2205)
    {
        // do some operation on those 2205 bytes which stored on the array to_send

        counter = 0;
        to_Send[counter] = b;
        counter++;
    }
}

配列を固定数の範囲に分割したいだけです

4

5 に答える 5

1

クラス Array には、両方の配列内の位置から指定された長さだけ、ある配列から別の配列にコピーする静的メソッドがあります。

Array.Copy(array1、pos1、array2、pos2、長さ)

int block = 2205;
int counter = 0;
byte[] to_Send = new byte[block];
Array.Copy(ARCHIEVE_BUFFER, 0, to_Send, 0, 2205);

最初のブロックで満たされた配列で何をしたいのかは不明ですがto_Send、Array.Copy の周りにループを追加するのは簡単なはずです。ループごとに開始位置を変更し、ARCHIEVE_BUFFER から抽出された新しいデータを使用します。

于 2013-07-17T21:12:23.770 に答える
0

または別の方法で、Enumerable.SkipEnumerable.Takeを使用します。

//ARCHIEVE_BUFFER: source array 
//block: the size of slice
for(var i=0; i<ARCHIEVE_BUFFER.Length;i+=block) {
    var to_Send = ARCHIEVE_BUFFER.Skip(i).Take(block);
    ProcessSubArray(to_Send);
}
于 2013-07-17T21:15:47.523 に答える
0

新しい配列を作成し、これには Buffer.BlockCopy を使用します。Array を繰り返し処理し、Byte ごとに Byte をコピーすることは、静かで非効率的です。

byte[] toSend = null;
int Remaining = ARCHIEVE_BUFFER.Length;
int Packed = 0;

while(Remaining > 0){
   toSend = new byte[Remaining >= block ? block : Remaining];
   Buffer.BlockCopy(toSend, 0, ARCHIEVE_BUFFER, Packed, toSend.Length); // not sure about params
   Packed += toSend.Length;
   Remaining -= toSend.Length;

   // todo: send here
}
于 2013-07-17T21:08:22.343 に答える
0

上記のArray.Copy方法またはを使用します。Buffer.BlockCopyただし、パフォーマンスが重要な状況では、 を使用してBlockCopyください。

Array.Copy(sourceArray, 0, destinationArray, 0, size);

また

Buffer.BlockCopy(sourceArray, 0, destinationArray, 0, size);
于 2013-07-17T21:12:44.620 に答える