如何将字节数组与较大的字节数组匹配,并获取唯一数据和模式结束的字节数组中的位置?
<小时 />FF FF FF FF XX XXXX XX FFF FF FF
<小时 />我有上述模式(其中 XX 是任何字节),我需要获取粗体部分加上最后一个字节数组中的位置,我该怎么做?(注意:我需要获取此模式的所有出现次数)
我无法将其转换为字符串,因为它具有空字节 (0x00),并且它们通常是前四个
XX XX XX XX 字节的一部分。我一直在努力解决这个问题一段时间了,如果你们能帮助我,我将不胜感激!谢谢。
编辑:以上字节为十六进制
谁说你不能把它转换成字符串?
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
向后搜索,你会匹配第二个,这可能不是你想要的。
另一种方法是为自己构建一个向前搜索的小状态机。这会更快,但有点困难。