Pat*_*Pat 5 .net byte sequence multibyte
我需要解析文件中的字节,以便在识别出某个字节序列后才获取数据.例如,如果序列只是0xFF(一个字节),那么我可以在集合上使用LINQ:
byte[] allBytes = new byte[] {0x00, 0xFF, 0x01};
var importantBytes = allBytes.SkipWhile(byte b => b != 0xFF);
// importantBytes = {0xFF, 0x01}
Run Code Online (Sandbox Code Playgroud)
但有没有一种优雅的方法来检测多字节序列 - 例如0xFF,0xFF - 尤其是在它开始得到误报匹配的情况下回溯?
我不知道任何内置的方式;像往常一样,您始终可以编写自己的扩展方法。这是我想到的一个(可能有更有效的方法来实现它):
public static IEnumerable<T> AfterSequence<T>(this IEnumerable<T> source,
T[] sequence)
{
bool sequenceFound = false;
Queue<T> currentSequence = new Queue<T>(sequence.Length);
foreach (T item in source)
{
if (sequenceFound)
{
yield return item;
}
else
{
currentSequence.Enqueue(item);
if (currentSequence.Count < sequence.Length)
continue;
if (currentSequence.Count > sequence.Length)
currentSequence.Dequeue();
if (currentSequence.SequenceEqual(sequence))
sequenceFound = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我必须检查以确保这是正确的,但它应该为您提供基本的想法;迭代元素,跟踪检索到的最后一个值序列,找到序列时设置一个标志,设置标志后,开始返回每个后续元素。
编辑-我确实运行了测试,它确实工作正常。这是一些测试代码:
static void Main(string[] args)
{
byte[] data = new byte[]
{
0x01, 0x02, 0x03, 0x04, 0x05,
0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA
};
byte[] sequence = new byte[] { 0x02, 0x03, 0x04, 0x05 };
foreach (byte b in data.AfterSequence(sequence))
{
Console.WriteLine(b);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |