我有一个我想读的二进制文件。我真的不知道文件的样子。但是,我知道每条消息都包含一个标题,一些消息特定的字段,以及一个终止字符串,它是" DBDBDBDB"
这是文件包含的内容:
(以及其他一些数据,但这是它的要点。)
此文件是来自交换的数据流,其中包含不同交易者之间的交互,我的工作是解码流。
我的问题是,我不知道如何显示这个二进制文件的内容,所以我无法将数据妥善存储到结构中。
我已经尝试了以下操作,并在打印出乱码时崩溃了我的cmd窗口。
struct Header
{
uint16_t marker;
uint8_t msg_type;
uint64_t sequence_id;
uint64_t timestamp;
uint8_t msg_direction;
uint16_t msg_len;
};
void parseFile(string filename)
{
streampos size;
Header h;
ifstream file (filename, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
file.read ((char*)&h.marker, sizeof(h.marker));
file.read ((char*)&h.msg_type, sizeof(h.msg_type));
file.read ((char*)&h.sequence_id, sizeof(h.sequence_id));
file.read ((char*)&h.timestamp, sizeof(h.timestamp));
file.read ((char*)&h.msg_direction, sizeof(h.msg_direction));
file.read ((char*)&h.msg_len, sizeof(h.msg_len));
file.close();
}
cout<<h.marker<<endl;
cout<<h.msg_type<<endl;
cout<<h.sequence_id<<endl;
cout<<h.timestamp<<endl;
cout<<h.msg_direction<<endl;
cout<<h.msg_len<<endl;
}
然而,我得到的结果并不是我期待的结果;我正在
50
16654955463245608
9850698347210351
8
34
我期待第一行是&#39; ST&#39;,第二行是1,2,3
此外,该消息的协议是Little Endian,我使用的是windows7,它也是小端。
如果有人能指点我或指出正确的方向,我会非常感激。
这是与之前发布的问题不同的问题,因为之前的解决方案对我不起作用,而且我正在处理额外的数据类型。
非常感谢。
答案 0 :(得分:2)
您现在看到的问题是istream::read
想要一个指向char的指针,并且您正在传递其他类型的指针。您可以通过获取地址并将其投射来获取这么多代码:
file.read ((char *)&h.marker, sizeof(h.marker));
然后,您需要为其他字段添加类似的read
调用(但您最好添加一个的东西,让它工作,< em>然后继续前进。)