反序列化C数据

时间:2011-05-16 22:07:00

标签: python networking udp deserialization

我正在从C服务器到我的Python客户端通过网络接收结构。该协议是UDP。我无法控制服务器及其协议/数据格式。它由这个结构组成(是的,IPv4 +端口):

struct ip_s {
    uint8_t i1;
    uint8_t i2;
    uint8_t i3;
    uint8_t i4;
    uint16_t port; // big endian
};

除了转换为big-endian的端口之外,数据“按原样”发送,并转换为(char*)

如何将此结构接收为可由Python处理的格式?


其他信息:

  • Python 2.7或3.x
  • 跨平台
  • 最好只使用内置模块的解决方案

2 个答案:

答案 0 :(得分:3)

查看struct.unpack

它可能看起来像这样:

# socket setup

(buffer, sockaddress) = mysocket.recvfrom(6)
if len(buffer)== 6:
    i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer)

答案 1 :(得分:0)

  

我通过网络收到结构

停在那儿。不要那样做。此技术引入了以下依赖项:

  1. 字顺序:big-endian或little-endian。
  2. 填充。
  3. 包装。
  4. (2)和(3)依次取决于:

    1. 编译器。
    2. 编译器版本。
    3. 周围的#pragmas。
    4. 编译C程序时生效的编译器选项。
    5. 这是相当多的依赖。不要这样做。定义应用程序协议并使用它。或者使用类似XDR的东西来解决问题。