Кто сказал, что вы не можете преобразовать его в строку?
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
, вы подходите ко второму, что, вероятно, не то, что вам нужно.
Другой способ - создать себе небольшой конечный автомат, который ищет вперед.Это будет быстрее, но немного сложнее.