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