unsigned int VS python struct 模块中的 Unsigned long

Unsigned int VS Unsigned long in python struct module

提问人:Mika 提问时间:7/20/2023 最后编辑:Kiran ShahiMika 更新时间:7/21/2023 访问量:109

问:

我正在阅读python结构模块的文档,发现了有趣的事情。

enter image description here

Unsigned int 和 unsigned long 都等于 4 个字节。

但是,据我所知,unsigned int 可以是 2 或 4 个字节,具体取决于 CPU。

所以,问题来了。我有带有little-endian系统的PC。这台电脑通过本地网络共享一些数据。我想通过套接字在另一台 PC(带有一些字节序系统,我不知道)中接收此数据。 我知道,主机 PC 将发送 4 个变量,这些变量uint32_t

我应该如何在python中解压缩这些值,为什么?我应该使用 unsigned long 还是 unsigned int?在文档中,它们具有相同的大小。那么,格式字符串会看起来像 4L 还是 4I

还有另一个问题 - 我应该如何避免字节序冲突?主机 PC 是 100% 小端,将来不会改变。客户端 PC 可能不同,那么,我应该编写这样的结构字符串吗:<4L(或 <4I,取决于上一个问题)?或者我应该使用 !4 bc 我从本地网络接收数据(通过套接字)?

对一些相关问题的研究没有多大帮助,所以,我在这里。

请阐明这个问题,只要我把这个话题弄乱一点。

python c python-3.x 套接字 解码

评论

0赞 Some programmer dude 7/20/2023
如果你有一个二进制通信协议(一个不使用纯文本格式的协议),那么你需要在实现它之前对它进行明确定义。包括定义所有数据的大小及其字节顺序。然后,使用该协议的应用程序必须适应该协议及其定义,包括字节交换字和使用适当的本地类型。尽管现在很少需要不使用 UTF-8 编码的基于文本的协议。
0赞 Mika 7/20/2023
@Someprogrammerdude,是的,我很乐意使用 UTF:) 但是我与机器人控制器达成了协议,它是用 C 语言编写的,它只是在本地网络上发送所有数据。所以,控制器是由其他程序员编写的,所以,他们不想改变任何东西。事实上,我有一个 C 结构,它有一些双精度值,一些uint8_tuin32_int。我应该如何在python端对这个整数进行转码?
0赞 Bodo 7/20/2023
您应该编辑您的问题,并在问题中添加所有要求的信息或说明。如果机器人控制器只是发送二进制结构,那么你必须分析数据的大小和字节序以及二进制结构表示中可能的填充,并以此作为协议规范。这可能特定于平台(CPU、操作系统、编译器,可能是编译器版本和/或选项),如果它们更改了与编译器相关的任何内容,将来可能会更改。

答:

0赞 Captain Trojan 7/20/2023 #1

为什么要为“C型”列而烦恼?就你和我而言,这只是 Python 中的“一些”库。您想将接下来的 4 个字节读取为无符号整数吗?只是使用或,这显然无关紧要。struct.unpack('I', buffer)struct.unpack('L', buffer)

另外,我不确定 or 中的字符“4”是什么意思,除非您尝试从缓冲区中准确解析 4 个无符号 4 字节整数(总共 16 个字节)。4L4I

评论

1赞 Mika 7/20/2023
是的,我想读取 4 个整数。事实上,我有一个更大的 C 结构,所以我需要编写一个相当长的结构字符串来解压缩这个结构。