如何将数组拆分为多个以特定值开头的子数组?

问题描述 投票:0回答:1

我正在寻找一种通过 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

但我不知道如何实施。

请帮我一些提示或代码。 谢谢

c# arrays split byte
1个回答
0
投票

您可以使用 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>
。但即使如此,如果您更改原始数组的值,跨度也会反映这些更改。

© www.soinside.com 2019 - 2024. All rights reserved.