struct.unpack用于网络字节顺序二进制编码的数字

时间:2013-11-20 23:03:37

标签: python-2.7 parsing binary-data

我对Python完全不熟悉。我必须解析一个包含网络字节顺序二进制编码数字的.txt文件(有关数据的详细信息,请参阅here)。我知道我必须在Python中使用包struct.unpack。我的问题如下:

(1)由于我不太了解函数struct.unpack的工作原理,是否可以直接解析数据?通过这个,我的意思是,如果你看data structure,似乎我必须为每种类型的消息编写代码。但是,如果我在网上查看struct.unpack上的文档,它似乎更直接,但我不知道如何编写代码。一个简短的样本将不胜感激。

(2)解析数据后,最佳做法是什么?我想保存解析的文件,以避免每次我需要进行查询时解析文件。我应该以什么格式保存最有效的解析文件?

1 个答案:

答案 0 :(得分:1)

这应该相对简单。我无法评论你实际上应该如何获取字节编码的信息包,但我可以帮你解析它们。

首先,这里是我将从文档第4部分收集的一些数据包类型的列表:

  1. 时间戳
  2. 系统事件消息
  3. 股票相关消息
    1. 股票指南
    2. 股票交易行动
    3. Reg SHO卖空价格测试限制指标
    4. 市场参与者职位
  4. 添加订单消息
  5. 这继续。但作为一个例子,让我们看看如何解码其中的一个或两个:


    系统事件消息

    System Event Message数据包有3个部分,长度为6个字节:

    1. 消息类型,从字节0开始,长度为1个字节,值为S(单个字符)
    2. TimeStamp,从字节1开始,长度为4个字节,应在整数中解释。
    3. Event Code,从字节5开始,长度为1个字节,是一个字符串(Alpha)。
    4. struct.unpack code table中查找每个类型,我们需要构建一个字符串来表示此序列。首先,我们有一个Character,然后是4Byte Unsigned Integer,然后是另一个Character。这对应于"cIc"的编码和解码字符串。

      *注意:整数的未签名部分记录在其文档的Section 3: Data Types

      构建虚假数据包

      这可能会做得更好,但它有效:

      >>> from datetime import datetime
      >>> import time
      >>> data = struct.pack('cIc', 'S', int(time.mktime(datetime.now().timetuple())), 'O')
      >>> print repr(data)  # What does the bytestring look like?
      'S\x00\x00\x00\xa6n\x8dRO'  # Yep, that's bytes alright!
      

      打开数据包

      在这个例子中,我们将使用上面的假包,但在现实世界中我们使用真实的数据响应:

      >>> response_tuple = struct.unpack('cIc', data)
      >>> print(repr(response_tuple))
      ('S', 1385000614, 'O')
      

      在这种情况下,元组中的第3项('O')是一个键,在另一个名为System Event Codes - DailySystem Event Codes - As Needed的表中查找。

      如果您需要其他示例,请随时提出,但这就是它的主旨。


      有关如何存储此数据的建议。好吧,我想这取决于你想长期对这些数据做什么。可能这里的数据库很有意义。但是,如果没有进一步的信息,我不能说。

      希望有所帮助!