C#将hex值的byte 拆分为byte 的新数组

我想从一个字节数组的IP数据包中获取数据并将其拆分为以0x47开头的字节数组集合,即mpeg-2传输数据包。

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

 08 FF FF 47 FF FF FF 47 FF FF 47 FF 47 FF FF FF FF 47 FF FF 

你如何在0x47上拆分字节数组并保留分隔符0x47 ,使它看起来像这样? 顺便说一下以特定hex开头的字节数组数组?

 [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 

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

 public static IEnumerable SplitByteArray(IEnumerable source, byte marker) { if (null == source) throw new ArgumentNullException("source"); List current = new List(); 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 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); 

可能的解决方案:

 byte[] source = // ... string packet = String.Join(" ", source.Select(b => b.ToString("X2"))); // chunks is of type IEnumerable> var chunks = Regex.Split(packet, @"(?=47)") .Select(c => c.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => Convert.ToByte(x, 16))); 

有几种方法可以做到这一点,最简单的方法是使用.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 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]; } 

编辑:类似于我现在已经存在的答案。