2014-05-10 5 views
0

Я написал короткую программу для поиска строки в двоичном файле. Файл состоит из текста и содержимого Base64. Если я тестирую его с помощью текстового файла ASCII, он работает. Если я попробую его с двоичным файлом, он ничего не соответствует.Поиск строки в двоичном файле с C++

Так что вы можете сказать мне:

  1. Где моя вина?
  2. Каков наилучший (вычислительный) способ поиска строки в двоичном файле?

UPDATE: Прямое сравнение строк работает, поэтому проблема должна быть где-то в определении регулярного выражения.

Код

19 #include<iostream> 
20 #include<fstream> 
21 #include<regex> 
22 #include<string> 
23 
24 using namespace std; 
25 
26 int main(int argc, char* argv[]) { 
27  if (argc != 2){ 
28   cout << "Error message"; 
29  } 
30 
31  regex type_response ("(TEST:)(.*)"); 
32  regex target_value ("(VALUE:)(.*)"); 
33  regex target_version ("(NAME:)(.*)"); 
34 
35  ifstream infile(argv[1], ios::binary); 
36 
37  if (infile.is_open()){ 
38   string line; 
39   while (getline(infile, line)){ 
40    if (regex_match(line ,target_version)){ 
41     cout << line; 
42    } 
43   }; 
44  infile.close(); 
45 
46  return 0; 
47  } 
48 
49  else { 
50   cout << "Could not open file.\n"; 
51   return 1; 
52  }; 
53 }; 
+0

'getline' доходит до новой строки, а двоичные файлы не имеют« строк ». Вы проверили, не кажется ли, что 'line' выглядит так, как вы ожидаете? – crashmstr

+0

Если строка cout, она печатает строку, как и ожидалось, я также проверил typeid, это строка. – Steffen

+0

Вклеивание кода с номерами строк не круто. – cubuspl42

ответ

0

Проблема была неправильным регулярным выражением, остальная часть кода работает.

0

Файл ASCII представляет собой двоичный файл, который хранит ASCII-коду и код ASCII является 7-битовым кодом, хранящимся в бай. Хотя двоичный файл не имеет таких ограничений, и любой из 8 бит может использоваться в любом байте двоичного файла.

В файле ASCII старший бит каждого байта не используется, и это означает, что старший бит обрабатывается как 0. В двоичном файле это может быть 0 или 1. Таким образом, есть разница. Вы можете проверить шестнадцатеричную деталь двоичного файла с помощью таких инструментов, как HxD.

+0

Когда я храню строку в строковой переменной и регулярное выражение, она должна работать. Но это не так. – Steffen

+0

Как сделать такую ​​операцию для каждого байта в двоичном файле: 'byte = 0x7f &byte;' Затем выполните операцию 'regex'. –

Смежные вопросы