从 python struct.pack (big-endian) 转换为整数列表

我正在尝试将字符串(例如 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 中,我想“解包”到一个数组/结构中


万千封印
浏览 332回答 1
1回答

江户川乱折腾

假设您的问题的标题是正确的,并且值实际上是按大端顺序排列的,那么您需要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.在服务器端将整数重新组装到您的结构中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python