我正在尝试将字符串(例如 b'\x01\x00\x00\x00' <- 32 位整数)转换回我的 C 程序中的整数。客户端(在 Python 中):example = [1,2,3]struct.pack('i'*int(len(example)/4),packed)<Send over open socket to server>服务器(在 C 中):char buffer[1024];numbytes = recv(sockfd,buffer,1023,0);char message[numbytes];memcpy(message,buffer,n);<If 'message' is sent back, I can unpack on client>??? How to unpack on C then repack to send response to client ???在 C 中,我想“解包”到一个数组/结构中
1 回答

江户川乱折腾
TA贡献1851条经验 获得超5个赞
假设您的问题的标题是正确的,并且值实际上是按大端顺序排列的,那么您需要ntohl
(network to host long) 函数。为每个 32 位整数调用此函数以将它们转换为主机字节顺序。
根据该值b'\x01\x00\x00\x00'
,您似乎更有可能以小端顺序对值进行编码,而这实际上就是struct.pack
您在小端机器上运行时显示的调用将产生的结果。您的客户端和服务器可能都在 little-endian 硬件上运行(尽管您没有指定,因此不可能 100% 确定)。
在任何情况下,无论您使用何种形式,都需要在双方使用相同的字节序。最好不要让您的有线协议依赖于字节序,因此您应该确保客户端和服务器都将字节转换为通用字节序。Internet 标准指定 big-endian 作为网络协议的标准。
如果您决定对 big-endian 进行标准化,您需要执行以下操作:
更改您的
struct.pack
调用以选择整数的大端编码。您可以通过向'>'
结构定义添加前缀来实现此目的。更改您的 C 代码以一次读取每个整数(4 个字节用于 32 位值),然后将这些值传递
ntohl
给一个uint32_t
.在服务器端将整数重新组装到您的结构中。
添加回答
举报
0/150
提交
取消