Как найти строку в массиве байт?

Нужно найти строку в массиве байт. Т е из файла читается его содержимое в массив байт, затем в этом массиве ищется строка. Обычный find() или strstr() не помогут, т к файл бинарный -> т е могут встретиться символы переноса строки, нуль-байты и т д. Узнал про memmem, но для меня вариант оказался нерабочий - возвращает SIGSEGV:

#include <stdio.h>
#include <sys/stat.h>
#include <fstream>
#include <string.h>
using namespace std;

int main() {
    struct stat buf;
    stat("binary", &buf);
    const unsigned int fsize = buf.st_size;
    ifstream bins;
    bins.open("binary", ios::in|ios::binary);
    char *cbuf = new char[fsize];
    char ch;
    unsigned int k = 0;
    while(bins.get(ch)) {
        cbuf[k] = ch;
        k++;
    }
    bins.close();
    const void *pos = memmem(cbuf, fsize, "/system", 7);
    const int *ipos = (int *)pos;
    delete[] cbuf;
    printf("%d", *ipos);
    return 0;
}
 ~/work $ g++ -g main.cpp
 ~/work $ ./a.out
Segmentation fault
 ~/work $ gdb ./a.out
gdb > r
Starting program: /home/me/work/a.out

Program received signal SIGSEGV, Segmentation fault.
0x0000005555555dd0 in main () at main.cpp:24
24          printf("%d", *ipos);

А мне нужно найти строку в массиве байт таким образом, чтобы получить себе позицию начала строки в массиве. Т е, если первый символ искомого слова является 439м байтом, то должно вернуть число 439.


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

Автор решения: Stanislav Volodarskiy

Вычитайте указатели на char * чтобы вычислить смещение.

const char *pos = static_cast<const char *>(memmem(cbuf, fsize, "/system", 7));
if (pos == nullptr) {
    printf("Not found\n");
} else {
    const ptrdiff_t ipos = pos - cbuf;
    printf("%td", ipos);
}
delete[] cbuf;
→ Ссылка
Автор решения: RandomDice 779
const char *pos = static_cast<const char*>(memmem(cbuf, fsize, "/system", 7));
const ptrdiff_t ipos = pos - cbuf;
if (ipos < 0 || ipos > fsize) {
printf("Can't find!\n");
} else {
printf("%d\n", ipos);
}
→ Ссылка