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