如何将字节数组与较大的字节数组匹配,并获取模式结束的字节数组中的唯一数据和位置?
FF FF FF FF XX XX XX XX FF FF FF FF (任何字节长度都在这里)2E XX XX XX 00
我有上面的模式(其中XX是任何字节),我需要获得粗体部分加上最后一个字节数组中的位置,我该怎么做? (注意:我需要得到所有这种模式)
我无法将其转换为字符串,因为它具有空字节(0x00),并且它们通常是前四个 XX XX XX XX 字节的一部分。
我一直在努力解决这个问题,如果你们能帮帮我的话,我会很感激!感谢。
编辑:上面的字节是十六进制
答案 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
向后搜索,你会匹配第二个,这可能不是你想要的。
另一种方法是建立一个向前搜索的小型状态机。这会更快,但有点困难。