从二进制文件中提取类似于xxd输出的数据

时间:2018-11-05 11:12:58

标签: c++ fstream binaryfiles 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 ++代码导入此文件,但是我正努力了解其工作原理。
我正在尝试的文件可以在here中找到,并带有字节结构的相应说明。据我了解的解释(我之前从未使用过二进制文件),前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不做任何操作即可?之后,我希望代码在第20个字节之后输出前100个字符。我不确定seekg(20)是否确实跳到了第20个字节,而我无法弄清here的内容。
我实际得到的输出是-1和一些奇怪的三角形字符。
最终,我的目标是将文件的数据存储在arraystructtx的{​​{1}}或y中。但是,只要我对二进制文件的使用和使用有了更多的了解,我就可以自己解决这个问题。
我还想知道的一点是,为什么pol在每个6字节之后输出分解为多行的文件头,而不是仅将其放在数据前。

0 个答案:

没有答案