C#将字节数组拆分成单独的块并获取块数

时间:2018-06-02 09:08:20

标签: c# byte

想要将一个字节数组拆分成最多1000个字节的块,并获得生成块的数量:

byte[] buffer = File.ReadAllBytes("binarydata");
在这种情况下,

buffer是10100字节,所以它是11个块,10个,每个1000字节,1个100字节。

2 个答案:

答案 0 :(得分:3)

如果您只需要知道块的数量,可以执行以下操作:

var size = buffer.Length;
var chunkCount = (int)Math.Ceiling(size / 1000F);

如果您还想将缓冲区拆分为多个缓冲区,则可以创建一个数组数组,如下所示:

var bufferArray = new byte[chunkCount][];

然后你可以像这样填充这个新的数组:

for (var i = 0; i < chunkCount; i++) {
    bufferArray[i] = new byte[1000];
    for (var j = 0; j < 1000 && i * chunkCount + j < size; j++) {
        bufferArray[i][j] = buffer[i * chunkCount + j];
    }
}

我希望这能回答你的问题:)

编辑:

如果您需要最后一个内部数组与剩余数据的大小完全相同,则可以像这样初始化内部数组:

bufferArray[i] = new byte[Math.Min(1000, size - i * 1000)];

EDIT2:

正如xanatos在评论中指出的那样,chunkSize可以通过这种方式更快地计算出来:

var chunkCount = (size + 999) / 1000;

答案 1 :(得分:3)

出于好奇,另一个版本。我认为有各种各样的兴趣点。使用整数除法但是向上舍入,例如((buffer.Length + blockSize - 1) / blockSize),或在for周期(j)中使用第二个索引器,这样我们就不会必须做乘法。并使用Buffer.BlockCopy,这通常比复制数组快#34;手动&#34; (第二个for周期)

public static byte[][] BufferSplit(byte[] buffer, int blockSize)
{
    byte[][] blocks = new byte[(buffer.Length + blockSize - 1) / blockSize][];

    for (int i = 0, j = 0; i < blocks.Length; i++, j += blockSize)
    {
        blocks[i] = new byte[Math.Min(blockSize, buffer.Length - j)];
        Array.Copy(buffer, j, blocks[i], 0, blocks[i].Length);
    }

    return blocks;
}