Как мне найти последовательность байтов в файле? - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу найти это расположение байтов в файле:

[18] [53] [80] [67] (HEX) 00011000 1010011 10000000 1100111

Байты представляют Matroska Сегмент EBML ID https://www.matroska.org/technical/specs/index.html

Я пытаюсь выполнить поиск в этом файле, но безрезультатно:

    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    char * buffer = new char [8];

    std::cout << "Reading " << length << " characters... ";
    // read data as a block:
      for(int i=0;i<length;i++){
       std::cout<<i<<std::endl;
       is.read (buffer,sizeof(char));
       if((int)(unsigned  char)buffer[0] == 1)         
           if((int)(unsigned  char)buffer[1] == 8)     
               if((int)(unsigned  char)buffer[3] == 10)
                   if((int)(unsigned  char)buffer[4] == 3)
                       if((int)(unsigned  char)buffer[5]==8)
                           if((int)(unsigned  char)buffer[6]==0)
                               if((int)(unsigned  char)buffer[7]==12)
                                   if((int)(unsigned  char)buffer[8]==7)
                                       std::cout<<"finish !!!!";

Мой подход неверен?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Прежде всего, вы должны помнить, что каждое показанное вами шестнадцатеричное число (например, 18) представляет собой однобайтный . То есть вам нужно прочитать и проверить четыре байта вместо восьми.

Во-вторых, вам не нужно сравнивать все байты по отдельности, вы можете читать четыре байта за раз и сравнивать с массив байтов, содержащий данные, которые вам нужно найти:

// The data we need to find in the file
uint8_t data_to_find[] = { 0x18, 0x53, 0x80, 0x67 };

// The data from the file
uint8_t current_data[sizeof data_to_find];

Затем прочитайте sizeof current_data байтов в массив current_data и сравните с data_to_find:

if (std::memcmp(data_to_find, current_data, sizeof data_to_find) == 0)
{
    // Found the data
}
else
{
    // Didn't find the data
}
1 голос
/ 19 февраля 2020

Если я правильно вас понял, вы можете использовать алгоритм поиска:

// ...
std::ifstream is( file_name, std::ios::binary );
if ( !is )
  return -1;
std::array<std::char, 4> ebml_id{ 0x18, 0x53, 0x80, 0x67 };
auto res = std::search( std::istream_iterator<char>( is ), std::istream_iterator<char>(), ebml_id.begin(), ebml_id.end() );
// ...
...