Получить все вхождения байтового шаблона с различными байтами из байтового массива? - PullRequest
0 голосов
/ 21 мая 2011

Как можно сопоставить байтовый массив с байтовым массивом большего размера и получить уникальные данные и местоположение в байтовом массиве, в котором заканчивается шаблон?


FF FF FF FF XX XX XX XX FF FF FF FF (здесь указывается любая длина любых байтов) 2E XX XX XX 00


У меня есть описанный выше шаблон (где XX - любой байт), и мне нужно получить выделенные части плюс расположение в массиве последнего байта. Как я могу это сделать? (примечание: мне нужно получить все экземпляры этого шаблона)

Я не могу преобразовать ее в строку, поскольку она имеет нулевые байты (0x00), и они часто являются частью первых четырех XX XX XX XX байтов.

Я уже некоторое время пытаюсь понять это и буду признателен, если вы, ребята, сможете мне помочь! Спасибо.

Редактировать: байты в шестнадцатеричном формате

1 Ответ

2 голосов
/ 21 мая 2011

Кто сказал, что вы не можете преобразовать его в строку?

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.Это не самый быстрый способ сделать 1017 *, но это довольно просто.

Обратите внимание, что если вы будете искать в обратном направлении от 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, вы подходите ко второму, что, вероятно, не то, что вам нужно.

Другой способ - создать себе небольшой конечный автомат, который ищет вперед.Это будет быстрее, но немного сложнее.

...