猿问

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

想将一个字节数组拆分为最多 1000 个字节的块,并获取结果块的数量:

byte[] buffer = File.ReadAllBytes("binarydata");

buffer 在这种情况下是 10100 字节,因此它将是 11 个块,10 个块,每个块 1000 个字节,一个块包含 100 个字节。


慕的地8271018
浏览 658回答 2
2回答

繁花不似锦

如果您只需要知道块的数量,您可以执行以下操作:var size = buffer.Length;var chunkCount = (int)Math.Ceiling(size / 1000F);如果您还想将缓冲区拆分为多个缓冲区,则可以创建一个数组数组,如下所示:var bufferArray = new byte[chunkCount][];然后,您可以像这样填充这个新的数组数组:for (var i = 0; i < chunkCount; i++) {&nbsp; &nbsp; bufferArray[i] = new byte[1000];&nbsp; &nbsp; for (var j = 0; j < 1000 && i * chunkCount + j < size; j++) {&nbsp; &nbsp; &nbsp; &nbsp; bufferArray[i][j] = buffer[i * chunkCount + j];&nbsp; &nbsp; }}我希望这回答了你的问题 :)编辑:如果您需要最后一个内部数组与剩余数据的大小完全相同,则可以像这样初始化内部数组:bufferArray[i] = new byte[Math.Min(1000, size - i * 1000)];编辑2:正如 xanatos 在评论中指出的那样,可以通过这种方式更快地计算 chunkSize:var chunkCount = (size + 999) / 1000;

aluckdog

出于好奇,另一个版本。我确实认为有各种各样的兴趣点。使用整数除法但四舍五入,例如 ( (buffer.Length + blockSize - 1) / blockSize),或在for循环中使用第二个索引器( j) 以便我们不必进行乘法运算。并且使用Buffer.BlockCopy, 这通常比“手动”复制数组更快(第二个for周期)public static byte[][] BufferSplit(byte[] buffer, int blockSize){&nbsp; &nbsp; byte[][] blocks = new byte[(buffer.Length + blockSize - 1) / blockSize][];&nbsp; &nbsp; for (int i = 0, j = 0; i < blocks.Length; i++, j += blockSize)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; blocks[i] = new byte[Math.Min(blockSize, buffer.Length - j)];&nbsp; &nbsp; &nbsp; &nbsp; Array.Copy(buffer, j, blocks[i], 0, blocks[i].Length);&nbsp; &nbsp; }&nbsp; &nbsp; return blocks;}
随时随地看视频慕课网APP
我要回答