Извлечение данных, аналогичных выводу xxd из двоичных файлов - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть двоичный файл, который представляет выходные данные датчика.
На моем bash-терминале я могу показать данные файла, используя xxd -b atis.es, что приводит к выводу, подобному этому:

00000000: 01000101 01110110 01100101 01101110 01110100 00100000 Событие
00000006: 01010011 01110100 01110010 01100101 01100001 01101101 Поток
0000000c: 00000010 00000000 00000000 00000010 01000000 00000001 .... @.
00000012: 11110000 00000000 00000010 00000000 00000000 11101111 ......

Сейчас я пытаюсь импортировать этот файл в мой код C ++, но я пытаюсь понять, как это работает.
Файл, над которым я работаю, можно найти здесь с соответствующим объяснением Байт-структуры. Насколько я понимаю объяснение (я никогда раньше не работал с двоичными файлами), первые 19 байт - это просто заголовок, поэтому данные записываются в байт 20 и далее. Поэтому в C ++ я использовал этот код:

#include <sstream>
#include <fstream>
#include <iostream>
#include <cstdint>

int main(int argc, char **argv){
  std::ifstream data;
  data.open("path-to-file/atis.es", std::ios::binary);

  std::cout<<data.tellg()<<'\n'; % check current position
  data.seekg(20); % jump to 20th byte
  char buffer[100];
  data.read(buffer,100);
  std::cout<<buffer<<std::endl;
}  

Из этого кода я бы ожидал, что сначала он выведет 0, потому что tellg() должен возвращать 0 в качестве позиции, если я ничего не делал с fsteam или нет? После этого я ожидаю, что код выведет первые 100 символов после 20-го байта. Я не уверен, что если seekg(20) действительно перейдет на 20-й байт, и я не смог понять это, прочитав об этом здесь .
На самом деле я получаю вывод -1 и странный треугольный символ.
В конечном счете, моя цель - сохранить данные файла в array или struct с полями t, x, y, pol. Но я думаю, что смогу понять это самостоятельно, как только я пойму немного больше о том, как использовать и работать с двоичными файлами.
Еще кое-что, что мне хотелось бы знать, это то, почему xxd выводит заголовок файла, разбитый на несколько строк после каждой из 6 байтов, а не просто помещает его перед данными.

...