Идея таблицы поиска
Есть только 256 возможных байтов. Этого достаточно, чтобы вы могли построить таблицу поиска всех возможных комбинаций битов, которые могут происходить в одном байте.
Значение таблицы поиска может записывать битовую позицию шаблона, а также может иметь специальные значения, отмечающие возможные значения начала продолжения или окончания продолжения.
Edit:
Я решил, что значения продолжения будут глупыми. Вместо этого для проверки шаблона, который перекрывает байт, сдвиньте байт и ИЛИ в бите от другого байта или вручную проверьте конечные биты в каждом байте. Возможно ((bytes[i] & 0x01) & (bytes[i+1] & 0x80)) == 0x80
и ((bytes[i] & 0x01) & (bytes[i+1] & 0x80)) == 0x01
подойдут для вас.
Вы не сказали, поэтому я также предполагаю, что вы ищете первое совпадение в любом байте. Если вы ищете каждое совпадение , тогда проверка конечного шаблона на +66 битах - это другая проблема.
Чтобы создать таблицу поиска, я написал бы программу, которая сделает это для меня. Он может быть на вашем любимом языке сценариев или на языке C. Программа напишет файл, который будет выглядеть примерно так:
/* each value is the bit position of a possible pattern OR'd with a pattern ID bit. */
/* 0 is no match */
#define P_01 0x00
#define P_10 0x10
const char byte_lookup[256] = {
/* 0: 0000_0000, 0000_0001, 0000_0010, 0000_0011 */
0, 2|P_01, 3|P_01, 3|P_01,
/* 4: 0000_0100, 0000_0101, 0000_0110, 0000_0111, */
4|P_01, 4|P_01, 4|P_01, 4|P_01,
/* 8: 0000_1000, 0000_1001, 0000_1010, 0000_1011, */
5|P_01, 5|P_01, 5|P_01, 5|P_01,
};
утомительный. Вот почему я написал бы программу, чтобы написать это для меня.