反序列化C数据
我正在通过网络从一个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
我正在通过网络接收一个结构体。
等一下,别这么做。这种做法会引入以下几个问题:
- 字节顺序:大端序还是小端序。
- 填充。
- 打包。
而第(2)和第(3)又依赖于:
- 编译器。
- 编译器的版本。
- 周围的 #pragmas。
- 编译这个 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)