我正在寻找一种通过 C# 将数组拆分为多个以特定值开头的子数组的方法。
我有一个像这样的数组:
byte[] bytes = new byte[9];
bytes[0]=0x1a;
bytes[1]=0xAA;
bytes[2]=0xab;
bytes[3]=0xad;
bytes[4]=0xAA;
bytes[5]=0x01;
bytes[6]=0x02;
bytes[7]=0xAA;
bytes[8]= 0xac;
我想将它分成多个数组,以便每个新数组都以 0xAA 开头,如下所示:
数组1: 0xAA、0xab、0xad
数组2: 0xAA、0x01 0x02
数组3: 0xAA,0xac
但我不知道如何实施。
请帮我一些提示或代码。 谢谢
您可以使用 for 循环迭代数组。
int? lastIndex = null;
byte[] subArray;
for(int index = 0; index < bytes.Length; index++)
{
if(bytes[index] != 0xAA) continue;
if(lastIndex is not null)
{
int length = index - (int)lastIndex;
subArray = new byte[length];
Array.Copy(bytes, (int)lastIndex, subArray, 0, length);
//Do something with subArray
}
lastIndex = index;
}
if(lastIndex is null)
{
// Handle the case when no 0xAA is found
System.Console.WriteLine("No instances of 0xAA found");
return;
}
subArray = new byte[bytes.Length - (int)lastIndex];
Array.Copy(bytes, (int)lastIndex, subArray, 0, bytes.Length - (int)lastIndex);
//Do something with last subArray
这会查找 0xAA 的出现并将子数组创建为副本。如果您不需要副本,您还可以创建数组区域的跨度,如下所示:
int? lastIndex = null;
Span<byte> span;
for(int index = 0; index < bytes.Length; index++)
{
if(bytes[index] != 0xAA) continue;
if(lastIndex is not null)
{
span = bytes.AsSpan((int)lastIndex, index - (int)lastIndex);
//Do something with span
}
lastIndex = index;
}
if(lastIndex is null)
{
System.Console.WriteLine("No instances of 0xAA found");
return;
}
span = bytes.AsSpan((int)lastIndex, bytes.Length - (int)lastIndex);
//Do something with last span
如果您将某些内容分配给 span 的元素,它将更改您的原始数组。如果您不希望这样,您可以以完全相同的方式使用
ReadOnlySpan<byte>
。但即使如此,如果您更改原始数组的值,跨度也会反映这些更改。