为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕的地8271018 2021-07-08 14:01:31
想将一个字节数组拆分为最多 1000 个字节的块,并获取结果块的数量:byte[] buffer = File.ReadAllBytes("binarydata");buffer 在这种情况下是 10100 字节,因此它将是 11 个块,10 个块,每个块 1000 个字节,一个块包含 100 个字节。
查看完整描述

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;


查看完整回答
反对 回复 2021-07-18
?
aluckdog

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;

}


查看完整回答
反对 回复 2021-07-18
  • 2 回答
  • 0 关注
  • 657 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信