Как найти строку в массиве байт?
Нужно найти строку в массиве байт. Т е из файла читается его содержимое в массив байт, затем в этом массиве ищется строка. Обычный 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);
}