我知道这个答案有点晚了,但至少对于在搜索结果中找到这个问题的其他人可能会有用。因为你说Delphi代码发送和接收“C兼容数据”,所以就Python处理的答案而言,它似乎与另一端使用的是Delphi(或任何其他语言)无关...
Python的struct和socket模块具有您描述的基本用法的所有功能。要发送示例记录,您可以执行以下操作。为简单起见,我假定了有符号整数和双精度浮点数,并将数据打包为“网络顺序”(大端)。这可以很容易地成为一行代码,但出于可读性和可重用性的考虑,我将其拆分为几行:
import struct
t_packet_struc = '>iiid'
t_packet_data = struct.pack(t_packet_struc, pid, data_type, size, value)
mysocket.sendall(t_packet_data)
当然,如果对格式字符串、数据准备等进行调整,就不需要进行上述“假设”。请参阅struct内联帮助以获取可能的格式字符串的描述 - 它甚至可以处理像Pascal-strings这样的东西... 顺便说一下,socket模块允许打包和解包一些网络特定的东西,而struct则不行,例如IP地址字符串(转换为它们的大端int-blob形式),并允许显式函数将数据从大端转换为本机字节序,反之亦然。为了完整起见,以下是如何在Python端解包上面打包的数据:
t_packet_size = struct.calcsize(t_packet_struc)
t_packet_data = mysocket.recv(t_packet_size)
(pid, data_type, size, value) = struct.unpack(t_packet_struc,
t_packet_data)
我知道这在Python 2.x版本中有效,并且怀疑它在Python 3.x版本中也应该可以无需更改地工作。请注意一个重要的陷阱(因为很容易忽略,而且事后难以排除故障):除了不同的字节序外,您还可以根据如何前缀或不前缀格式字符串来区分使用“标准大小和对齐”(可移植)或使用“本机大小和对齐”(速度更快)打包东西。这些通常会产生与您预期大相径庭的结果,而不会给您任何提示原因...(有龙在其中)。
1024
更改为Delphi中Sizeof(TPacketData)
的Python等效值,并读取到一个记录(在C中是结构体)。通过执行相反的操作,你可以将其发送回去。(而且没有必要使用JSON或XML来传输少量的二进制数据。对于少于50个字节的数值数据,序列化的开销太大了吧?) - Ken White