为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2021-08-14 21:50:09
我正在尝试将字符串(例如 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.

  • 在服务器端将整数重新组装到您的结构中。


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 294 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信