反序列化C数据

3 投票
2 回答
633 浏览
提问于 2025-04-16 17:46

我正在通过网络从一个C语言服务器接收一个结构体到我的Python客户端。使用的协议是UDP。我无法控制服务器以及它的协议和数据格式。这个结构体包含了这些内容(没错,是IPv4地址加端口):

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

除了端口会被转换成大端格式外,数据是“原样”发送的,转换成了(char*)类型。

我该如何将这个结构体接收到Python中,使其可以被处理呢?


其他信息:

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

2 个回答

0

我正在通过网络接收一个结构体。

等一下,别这么做。这种做法会引入以下几个问题:

  1. 字节顺序:大端序还是小端序。
  2. 填充。
  3. 打包。

而第(2)和第(3)又依赖于:

  1. 编译器。
  2. 编译器的版本。
  3. 周围的 #pragmas。
  4. 编译这个 C 程序时使用的编译器选项。

这些依赖关系可真不少。别这么做。定义一个应用协议并使用它。或者使用像 XDR 这样的工具,它可以为你解决这个问题。

3

可以看看这个链接:struct.unpack

它的用法可能会像这样:

# socket setup

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

撰写回答