如何在.NET中的较大集合中查找值序列(特别是字节)

时间:2010-02-26 22:33:39

标签: .net byte sequence multibyte

我需要解析文件中的字节,这样我才能在识别出某个字节序列后才获取数据。例如,如果序列只是0xFF(一个字节),那么我可以在集合上使用LINQ:

byte[] allBytes = new byte[] {0x00, 0xFF, 0x01};
var importantBytes = allBytes.SkipWhile(byte b => b != 0xFF);
// importantBytes = {0xFF, 0x01}

但是有一种优雅的方法来检测多字节序列 - 例如0xFF,0xFF - 特别是在它开始得到误报匹配的情况下回溯?

3 个答案:

答案 0 :(得分:1)

如果将字节转换为字符串,则可以利用内置的无数搜索功能,即使您使用的字节实际上不是传统意义上的字符。

答案 1 :(得分:1)

我不知道任何内置方式;按照惯例,您始终可以编写自己的扩展方法。这是我头脑中的一个(可能有更有效的方法来实现它):

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;
        }
    }
}

我必须检查以确保这是正确的,但它应该给你基本的想法;迭代元素,跟踪检索到的最后一个值序列,在找到序列时设置一个标志,一旦设置了标志,就开始返回每个后续元素。

编辑 - 我确实运行了一个测试,它确实可以正常工作。这是一些测试代码:

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();
}

答案 2 :(得分:0)

就像一点理论;这是一个常规的语言问题。您可以使用正则表达式引擎来检测它。第一个谷歌点击“正常表达在线”发现

http://codeguru.earthweb.com/columns/experts/article.php/c14689