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