C#将字节[]按十六进制值拆分为新的字节[]数组

C#将字节[]按十六进制值拆分为新的字节[]数组,c#,mpeg2-ts,C#,Mpeg2 Ts,我想从一个IP数据包中获取数据,它是一个字节数组,并将其拆分为一个字节数组集合,这些字节数组以0x47开头,即 例如,原始字节数组如下所示: 08 FF FF 47 FF FF FF 47 FF FF 47 FF 47 FF FF FF FF 47 FF FF 如何拆分0x47上的字节数组,并保留清除器0x47,使其看起来像这样?以特定十六进制开始的字节数组的顺序字 [0] 08 FF FF [1] 47 FF FF FF [2] 47 FF FF [3] 47 FF [4] 47 FF F

我想从一个IP数据包中获取数据,它是一个字节数组,并将其拆分为一个字节数组集合,这些字节数组以
0x47
开头,即

例如,原始字节数组如下所示:

08 FF FF 47 FF FF FF 47 FF FF 47 FF 47 FF FF FF FF 47 FF FF 
如何拆分
0x47
上的字节数组,并保留清除器
0x47
,使其看起来像这样?以特定十六进制开始的字节数组的顺序字

[0] 08 FF FF
[1] 47 FF FF FF
[2] 47 FF FF
[3] 47 FF
[4] 47 FF FF FF FF
[5] 47 FF FF

有两种方法可以做到这一点,最简单的方法是使用.Split()并替换正在拆分的值

string[] values = packet.Split("47");
for(int i = 0; i < values.Length; i++)
{
    Console.WriteLine("[{0}] 47 {1}", i, values[i]);
    // C# 6+ way: Console.WriteLine($"[{i}] 47 {values[i]}");
}
string[]value=packet.Split(“47”);
for(int i=0;i

当然,您可以始终使用正则表达式,但我的正则表达式技能非常有限,我个人不认为我可以为此构建有效的正则表达式。

对您来说可能有点太粗糙,但应该可以正常工作:

string ins = "08 FF FF 47 FF FF FF 47 FF FF 47 FF 47 FF FF FF FF 47 FF FF ";
string[] splits = ins.Split(new string[] { "47" }, StringSplitOptions.None);
for (int i = 0; i < splits.Length; i++) {
     splits[i] = "47 " + splits[i];
}
string ins=“08 FF FF 47 FF FF 47 FF FF 47 FF FF FF 47 FF FF”;
string[]splits=ins.Split(新字符串[]{“47”},StringSplitOptions.None);
对于(int i=0;i
编辑:我想与已经存在的答案类似。

一个可能的解决方案:

byte[] source = // ...
string packet = String.Join(" ", source.Select(b => b.ToString("X2")));

// chunks is of type IEnumerable<IEnumerable<byte>>
var chunks = Regex.Split(packet, @"(?=47)")
             .Select(c =>
                 c.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                 .Select(x => Convert.ToByte(x, 16)));
byte[]源=/。。。
string packet=string.Join(“,source.Select(b=>b.ToString(“X2”));
//块属于IEnumerable类型
var chunks=Regex.Split(数据包@“(?=47)”)
.选择(c=>
c、 拆分(新[]{''},StringSplitOptions.RemoveEmptyEntries)
.Select(x=>Convert.ToByte(x,16));

您可以轻松实现所需的拆分器:

public static IEnumerable<Byte[]> SplitByteArray(IEnumerable<Byte> source, byte marker) {
  if (null == source)
    throw new ArgumentNullException("source");

  List<byte> current = new List<byte>();

  foreach (byte b in source) {
    if (b == marker) {
      if (current.Count > 0)
        yield return current.ToArray();

      current.Clear();
    }

    current.Add(b);
  }

  if (current.Count > 0)
    yield return current.ToArray();
}

这将起作用,
string[]mpegPackets=Regex.Split(数据,(?=47)”我想你是对的,我需要将十六进制值转换为字符串才能进行拆分。这不是关于
字节数组的问题吗?为什么不简单地循环一下呢?我想这应该在大约0(2n)个时间内起作用。
  String source = "08 FF FF 47 FF FF FF 47 FF FF 47 FF 47 FF FF FF FF 47 FF FF";

  // the data
  Byte[] data = source
    .Split(' ')
    .Select(x => Convert.ToByte(x, 16))
    .ToArray();

  // splitted
  Byte[][] result = SplitByteArray(data, 0x47).ToArray();

  // data splitted has been represented for testing
  String report = String.Join(Environment.NewLine, 
    result.Select(line => String.Join(" ", line.Select(x => x.ToString("X2")))));

  // 08 FF FF
  // 47 FF FF FF
  // 47 FF FF
  // 47 FF
  // 47 FF FF FF FF
  // 47 FF FF
  Console.Write(report);