Проверка массива байт на сигнатуры

Есть массив байт размером 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-го тома не добрался...


Ответы (0 шт):