如何在python中解析socket中的二进制数据?

时间:2012-04-27 22:47:38

标签: python parsing sockets modem

我目前正在开展一个项目,我需要与微硬蜂窝调制解调器IPn3G进行通信。我将调制解调器设置为通过TCP向我的计算机发送消息,我可以在套接字中接收消息。

消息看起来像这样:

���������DKReadyCANRogersWirelessInc. Home354626030393530302720391029547

现在,我可以识别其中的一些领域,如Status或Carrierinfo以及最终的imei和imsi。

我的问题是,我如何解析看起来很滑稽的东西?我已经尝试过struct,但它似乎并不能帮助我。

在调制解调器的文档中我只发现了这个:

Modem_event消息结构:

  • 固定标题(固定大小20字节)
  • 调制解调器ID(uint64_t(8字节))
  • 消息类型掩码(uint8_t(1字节))
  • 保留
  • 包长度(uint16_t(2字节)) 注意:数据包长度=固定标头的长度+消息有效负载的长度。

承运人信息:

  • 内容长度2 BYTES(UINT16_T)
  • RSSI 1 BYTE(UINT8_T)
  • RF Band 2 BYTES(UINT16_T)
  • 服务类型STRING(1-30字节)
  • 频道编号STRING(1-30字节)
  • SIM卡号码STRING(1-30字节)
  • 电话号码STRING(1-30字节)

对我来说,似乎这个消息甚至没有与它应该是什么排成一行。如果有人就如何解决这个问题提出建议,我会很高兴。

谢谢

1 个答案:

答案 0 :(得分:0)

Python有很棒的struct模块,它允许你打包和解包二进制数据。

我知道,你已经尝试过使用它了。我没有文档,为你的设备(去检查它!),但我可以假设,字符串是空终止的(它们之前没有给出它们的大小)。

获取消息的字符串部分的大小(从其他字段的大小和数据包长度),并使用<number>s将所有字​​符串读取到一个Python字符串中,并将它们拆分,找到空字符。