3 回答

TA貢獻2051條經驗 獲得超10個贊
如果速度不是問題
var bytes = new byte[640 * 6];
for (var i = 0; i <= bytes.Length; i+=640)
{
var chunk = bytes.Skip(i).Take(640).ToArray();
...
}
或者你可以使用
跨度切片法
Buffer.BlockCopy(Array, Int32, Array, Int32, Int32) 方法
跨度
Span<byte> bytes = arr; // Implicit cast from T[] to Span<T>
...
slicedBytes = bytes.Slice(i, 640);
塊復制
請注意,這可能是 3 個中最快的
var chunk = new byte[640]
Buffer.BlockCopy(bytes, i, chunk, 0, 640);

TA貢獻1878條經驗 獲得超4個贊
如果您真的想從每個 640 字節塊中創建新數組,那么您正在尋找.Skip并且.Take
這是我一起破解的一個工作示例(以及示例的副本)。
using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
class MainClass {
public static void Main (string[] args) {
// mock up a byte array from something
var seedString = String.Join("", Enumerable.Range(0, 1024).Select(x => x.ToString()));
var byteArrayInput = Encoding.ASCII.GetBytes(seedString);
var skip = 0;
var take = 640;
var total = byteArrayInput.Length;
var output = new List<byte[]>();
while (skip + take < total) {
output.Add(byteArrayInput.Skip(skip).Take(take).ToArray());
skip += take;
}
output.ForEach(c => Console.WriteLine($"chunk: {BitConverter.ToString(c)}"));
}
}
實際使用ArraySegment正確可能會更好——除非這是學習 LINQ 擴展的任務。

TA貢獻1934條經驗 獲得超2個贊
你可以像這樣編寫一個通用的輔助方法:
public static IEnumerable<T[]> AsBatches<T>(T[] input, int n)
{
for (int i = 0, r = input.Length; r >= n; r -= n, i += n)
{
var result = new T[n];
Array.Copy(input, i, result, 0, n);
yield return result;
}
}
然后你可以foreach循環使用它:
byte[] byteArray = new byte[123456];
foreach (var batch in AsBatches(byteArray, 640))
{
Console.WriteLine(batch.Length); // Do something with the batch.
}
或者,如果您想要批次列表,請執行以下操作:
List<byte[]> listOfBatches = AsBatches(byteArray, 640).ToList();
如果您想變得花哨,可以將其作為擴展方法,但僅在您將大量使用它時才建議這樣做(不要為您只會在一個地方調用的東西創建擴展方法?。?。
在這里,我更改了名稱InChunksOf()以使其更具可讀性:
public static class ArrayExt
{
public static IEnumerable<T[]> InChunksOf<T>(this T[] input, int n)
{
for (int i = 0, r = input.Length; r >= n; r -= n, i += n)
{
var result = new T[n];
Array.Copy(input, i, result, 0, n);
yield return result;
}
}
}
你可以這樣使用:
byte[] byteArray = new byte[123456];
// ... initialise byteArray[], then:
var listOfChunks = byteArray.InChunksOf(640).ToList();
[編輯] 將循環終止符從 更正r > n為r >= n。
- 3 回答
- 0 關注
- 216 瀏覽
添加回答
舉報