2 回答
TA贡献1851条经验 获得超4个赞
如果您只需要知道块的数量,您可以执行以下操作:
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)];
编辑2:
正如 xanatos 在评论中指出的那样,可以通过这种方式更快地计算 chunkSize:
var chunkCount = (size + 999) / 1000;
TA贡献1847条经验 获得超7个赞
出于好奇,另一个版本。我确实认为有各种各样的兴趣点。使用整数除法但四舍五入,例如 ( (buffer.Length + blockSize - 1) / blockSize),或在for循环中使用第二个索引器( j) 以便我们不必进行乘法运算。并且使用Buffer.BlockCopy, 这通常比“手动”复制数组更快(第二个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;
}
- 2 回答
- 0 关注
- 657 浏览
添加回答
举报