【问题标题】:Get all occurrences of a byte pattern with varying bytes from a byte array?从字节数组中获取所有出现的具有不同字节的字节模式?
【发布时间】:2011-05-21 15:38:11
【问题描述】:

如何将字节数组匹配到更大的字节数组并获取唯一数据以及模式结束的字节数组中的位置?


FF FF FF FF XX XX XX XX FF FF FF FF (任何长度的任何字节都在这里)2E XX XX XX 00


我有上述模式(其中 XX 是任何字节),我需要得到粗体部分加上最后一个字节在数组中的位置,我该怎么做? (注意:我需要获取所有出现的这种模式)

我无法将其转换为字符串,因为它具有空字节 (0x00),并且它们通常是前四个 XX XX XX XX 字节的一部分。

我一直在努力解决这个问题,如果你们能帮助我,我将不胜感激!谢谢。

编辑:以上字节为十六进制

【问题讨论】:

    标签: c# byte bytearray pattern-matching


    【解决方案1】:

    谁说不能转成字符串?

    byte[] bytes = new byte[]
    {
        0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x31, 0x32, 0x33, 0x34, 0xff, 0x2a, 0x00
    };
    var s = Encoding.Default.GetString(bytes);
    Console.WriteLine(bytes.Length);
    Console.WriteLine(s.Length);
    foreach (var c in s)
    {
        Console.Write("0x{0:X2}, ", (int)c);
    }
    Console.WriteLine();
    

    数组和字符串都显示长度为13。字符串输出的字节数与数组中的字节数相同。

    可以将其转换为字符串。然后您可以使用正则表达式来查找您要查找的内容。

    请注意,Encoding.Default 可能不是您想要的。您需要一个不修改任何字符的 8 字节编码。

    但是,如果您想要一种算法方式来做到这一点,那么您会想到几种方法。第一种方法(可能是最简单的)是向前扫描寻找2E,后跟三个字节,然后是00。然后从头再来,看看有没有找到FF FF FF FF XX XX XX XX FF FF FF FF。这不是最快的做事方式,但它非常简单。

    请注意,如果您从 2E 向后搜索,您最终可能会“找到”一个较短的字符串。也就是说,如果您的输入是:

    FF FF FF FF XX XX XX XX FF FF FF FF 01 02 FF FF FF FF XX XX XX XX FF FF FF FF 0A 0B 2E XX XX XX 00

    起始模式有两次出现。如果您从 2E 向后搜索,您会匹配第二个,这可能不是您想要的。

    另一种方法是为自己构建一个向前搜索的小型状态机。这样会更快,但会更难一些。

    【讨论】:

    • 将byte[]转换成字符串:string s = new string(bytes.Select(x => (char)c).ToArray());
    • @carlosfigueira:不错。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多