Извлечение данных, аналогичных выводу xxd из двоичных файлов

У меня есть двоичный файл, который представляет выходные данные датчика.
На моем 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 байтов, вместо того, чтобы просто поместить его перед данными.

0 ответов

Другие вопросы по тегам