用C ++读取二进制文件

时间:2016-06-10 14:48:15

标签: c++ iostream binaryfiles

我有一个我想读的二进制文件。我真的不知道文件的样子。但是,我知道每条消息都包含一个标题,一些消息特定的字段,以及一个终止字符串,它是" DBDBDBDB"

这是文件包含的内容:

  • 标题
    • marker(uint16_t)这将等于" ST"在消息中
    • MSG_TYPE(uint8_t)
    • sequence_id(uint64_t)
  • 订单输入消息
    • 标题
    • 价(UINT64)
    • 数量(UINT32)

(以及其他一些数据,但这是它的要点。)

此文件是来自交换的数据流,其中包含不同交易者之间的交互,我的工作是解码流。

我的问题是,我不知道如何显示这个二进制文件的内容,所以我无法将数据妥善存储到结构中。

我已经尝试了以下操作,并在打印出乱码时崩溃了我的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,它也是小端。

如果有人能指点我或指出正确的方向,我会非常感激。

这是与之前发布的问题不同的问题,因为之前的解决方案对我不起作用,而且我正在处理额外的数据类型。

非常感谢。

1 个答案:

答案 0 :(得分:2)

您现在看到的问题是istream::read想要一个指向char的指针,并且您正在传递其他类型的指针。您可以通过获取地址并将其投射来获取这么多代码:

file.read ((char *)&h.marker, sizeof(h.marker));

然后,您需要为其他字段添加类似的read调用(但您最好添加一个的东西,让它工作,< em>然后继续前进。)