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

Convert from python struct.pack (big-endian) to list of integers

*编辑:标题不正确,Big-Endian 应该是 Little-Endian。由于提供的解决方案不想更改。

我试图在我的 C 程序中将字符串(例如 b'\x01\x00\x00\x00' <- 32 位整数)转换回整数。

客户(在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中,我想'unpack'变成array/struct

谢谢!

假设您问题的 title 是正确的,并且值实际上是大端顺序,您需要 ntohl (network to host long) 函数.为每个 32 位整数调用此函数以将它们转换为主机字节顺序。

根据值 b'\x01\x00\x00\x00',您似乎更有可能以小端顺序对值进行编码,这实际上是您显示的 struct.pack 调用将产生的结果,如果您运行 它在小端机器上。您的客户端和服务器可能都 运行ning 在小端硬件上(尽管您没有指定,所以不可能 100% 确定)。

无论如何,无论你使用什么形式,你都需要在两边使用相同的字节顺序。最好不要使您的有线协议依赖于字节顺序,因此您应该确保客户端和服务器都将字节转换为通用字节序和从通用字节序转换出来。 Internet 标准指定 big-endian 作为网络协议的标准。

如果您决定对大端进行标准化,则需要执行以下操作:

  • 将您的 struct.pack 调用更改为 select 整数的大端编码。您可以通过向结构定义添加 '>' 前缀来实现。
  • 更改您的 C 代码以一次读取每个整数(4 个字节用于 32 位值),然后通过 ntohl 传递这些值以获得 uint32_t.
  • 将整数重新assemble到服务器端的结构中。