想要将一个字节数组拆分成最多1000个字节的块,并获得生成块的数量:
byte[] buffer = File.ReadAllBytes("binarydata");
在这种情况下, buffer
是10100字节,所以它是11个块,10个,每个1000字节,1个100字节。
答案 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;
}