我有一个表示传感器输出的二进制文件。
在我的 bash 终端上,我可以显示文件的数据,使用xxd -b atis.es
它会产生如下输出:
00000000:01000101 01110110 01100101 01101110 01110100 00100000事件
00000006:01010011 01110100 01110010100101001010100101 01100001 011011101流
0000000C:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来
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()
只要我没有对 fsteam 做任何事情,就应该返回 0 作为位置,或者不?之后,我希望代码在第 20 个字节之后输出前 100 个字符。我不确定,如果seekg(20)
真的跳到第 20 个字节,我无法弄清楚在这里阅读它。
我实际得到的输出是-1
一些奇怪的三角形字符。
最终我的目标是将文件的数据存储在一个array
或struct
带有字段t
, x
, y
, pol
. 但我想我可以自己解决这个问题,只要我对如何使用和处理二进制文件有了更多了解。
我还想知道的是为什么xxd
在每个 6 字节之后将文件的标题输出分解为多行,而不是仅仅将其放在数据之前。