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

3

使用 linq,您可以将数组拆分为blocksize字节块

int count=0;
int blocksize = 2205;
List<List<byte>> blocks =  ARCHIEVE_BUFFER
                            .GroupBy( _ => count++ / blocksize)
                            .Select(x=>x.ToList())
                            .ToList();
于 2013-07-17T21:14:16.800 回答
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用第一个块填充数组后做什么,但是应该很容易在数组周围添加一个循环。复制在每个循环处更改起始位置并使用从 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

使用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 回答
0

创建一个新数组并为此使用 Buffer.BlockCopy。遍历数组并按字节复制字节是安静的低效。

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 回答