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 關注
- 703 瀏覽
添加回答
舉報