Проверка массива байт на сигнатуры
Есть массив байт размером 2048 байт. Этот массив попадает на фабрику в которой нужно проверить этот массив на совпадение сигнатур:
byte[] Array = new byte[] { 0x00, 0x30, 0x00, 0x39, 0x00, 0x31, 0x00, 0x35, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30,
0x00, 0x38, 0x00, 0x31, 0x00, 0x33, 0x00, 0x30, 0x00, 0x32, 0x00, 0x37, 0x00, 0x38, 0x00, 0x35, 0x00, 0x35, 0x00,
0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x31, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x32, 0x00, 0xC3,
0x00, 0x32, 0x00, 0x2C, 0x00, 0x31, 0x00, 0x2C, 0x00, 0x32, 0x00, 0xC5, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x00, 0x32, 0x00, 0x35 };
сигнатуры я определил так:
byte[,] signature2 = new byte[,] { { 0x01, 0x30 }, { 0x02, 0x00 }, { 0x03, 0x39 }, { 0x04, 0x00 }, { 0x05, 0x31 } };
где первый элемент двухмерного массива - это смещение, второй элемент значение которое ожидаем увидеть по этому смещению.
Выполняю проверку так:
private static bool Check(byte[] bytes, byte[,] pattern)
{
int indexesLen = pattern.GetLength(0);
for(int i=0; i< indexesLen; i++)
{
if (bytes[pattern[i, 0]] != pattern[i, 1])
{
return false;
}
}
return true;
}
сама фабрика выглядит примерно так:
if (Check(Array, signature1))
{
//
}
else if(Check(Array, signature2))
{
//
}
else
{
//
}
Всего сигнатур около 60 штук. Смещение у сигнатур не всегда по порядку. То есть может быть 1-й байт, 6 - байт и 8 - байт и тд. Также длина сигнатуры может быть от 6 до 14 байт. Проверять нужно очень быстро, поэтому использовал массив. При использовании readonly span наблюдается деградация скорости. с массивом байт - 3900 ticks, readonly span - 11000 ticks. на одну проверку. Можно ли выполнять эту проверку как-то по другому? с сохранением скорости, разумеется. Интересуюсь не потому что меня этот вариант не устраивает, а с целью расширить кругозор. Задача не уникальная и скорее всего её уже решали и скорее всего что-то подобное написано у Кнута, просто я ещё до 3-го тома не добрался...