从字节数组中获取具有不同字节的所有字节模式?

时间:2011-05-21 15:38:11

标签: c# byte bytearray pattern-matching

如何将字节数组与较大的字节数组匹配,并获取模式结束的字节数组中的唯一数据和位置?


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


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

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

我一直在努力解决这个问题,如果你们能帮帮我的话,我会很感激!感谢。

编辑:上面的字节是十六进制

1 个答案:

答案 0 :(得分:2)

谁说您无法将其转换为字符串?

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向后搜索,你会匹配第二个,这可能不是你想要的。

另一种方法是建立一个向前搜索的小型状态机。这会更快,但有点困难。