Почему бы не использовать memchr()
для поиска потенциальных совпадений?
Кроме того, убедитесь, что вы имеете дело с рекламными акциями потенциально подписанных типов (char
может быть или не быть подписано).Обратите внимание, что хотя 0xff
и 0xd9
имеют старший бит, если рассматривать их как 8-битные значения, они являются неотрицательными целочисленными константами, поэтому для них не существует «расширения знака»:
char* searchBuffer(char* b) {
unsigned char* p1 = (unsigned char*) b;
int count = 0;
for (;;) {
/* find the next 0xff char */
/* note - this highlights that we really should know the size */
/* of the buffer we're searching, in case we don't find a match */
/* at the moment we're making it up to be some large number */
p1 = memchr(p1, 0xff, UINT_MAX);
if (p1 && (*(p1 + 1) == 0xd9)) {
/* found the 0xff 0xd9 sequence */
break;
}
p1 += 1;
}
return (char *) p1;
}
Кроме того, обратите внимание, что вы действительно должны передать некоторое представление о размере искомого буфера, если цель не найдена.
Вот версия, которая принимает параметр размера буфера:
char* searchBuffer(char* b, size_t siz) {
unsigned char* p1 = (unsigned char*) b;
unsigned char* end = p1 + siz;
for (;;) {
/* find the next 0xff char */
p1 = memchr(p1, 0xff, end - p1);
if (!p1) {
/* sequnce not found, return NULL */
break;
}
if (((p1 + 1) != end) && (*(p1 + 1) == 0xd9)) {
/* found the 0xff 0xd9 sequence */
break;
}
p1 += 1;
}
return (char *) p1;
}