0

我有一个表示传感器输出的二进制文件。
在我的 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一些奇怪的三角形字符。
最终我的目标是将文件的数据存储在一个arraystruct带有字段t, x, y, pol. 但我想我可以自己解决这个问题,只要我对如何使用和处理二进制文件有了更多了解。
我还想知道的是为什么xxd在每个 6 字节之后将文件的标题输出分解为多行,而不是仅仅将其放在数据之前。

4

0 回答 0