我需要从文件解析字节,这样我只字节的某一序列已被鉴定后取的数据。例如,如果序列是简单地为0xFF(一个字节),那么我可以在收集使用LINQ:

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

但有以检测多字节序列的优雅的方式 - 例如为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;
        }
    }
}

我要检查,以确保这是正确的,但它应该给你的基本理念;迭代通过元素,跟踪检索到的值的最后一个序列,设置一个标志,当该序列被发现,并且一旦该标志被设置,开始返回每个随后元素。

编辑 - 我并运行测试,并正确不工作。下面是一些测试代码:

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

其他提示

如果您将您的字节转换成一个字符串,你可以搜索内置于功能的无数的好处,即使你与实际上不是传统意义上的文字工作中的字节。

正如位理论;这是一个普通的语言问题。您可以使用正则表达式引擎检测到它。第一谷歌命中为“关于流的正则表达式”结果

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top