gpt4 book ai didi

python - long 的结构长度取决于字节顺序?

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:36 33 4
gpt4 key购买 nike

我想使用 struct.unpack() 来从 Python 2.7 中的字节字符串中获取长值,但我发现了一些奇怪的行为,我想知道这是否是一个错误或不,而且我能做些什么来解决它。

发生的情况如下:

import struct
>>> struct.unpack("L","")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 8

这是预期的行为。它需要一个 8 字节字符串来提取 8 字节长值。

现在我将字节顺序更改为网络字节顺序,得到以下结果:

>>> struct.unpack("!L","")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 4

突然之间,8 字节长值只需要 4 个字节。

这是怎么回事?我能做些什么来解决这个问题?

最佳答案

这里的问题是struct正在使用您机器的 native long第一种情况的大小,以及 struct的“标准”long第二个尺寸。

在第一个示例中,您没有指定 byte-order, size, and alignment specifier (@=<>!之一)所以struct假设'@' ,它使用您机器的 native 值,即您机器的 native long尺寸。为了跨平台保持一致, struct defines standard sizes for each type ,这可能与您机器的原始尺寸不同。除 '@' 之外的所有说明符使用这些标准尺寸。

所以,对于 long 来说, struct的标准是4字节,这就是为什么'!L' (或任何 '[=<>!]L' 期望 4 个字节。但是,您的机器的 native long 显然是 8 个字节,这就是为什么 '@L''L' 期望 8。如果您想使用机器的 native 字节顺序,但仍然为了与 struct 的标准大小兼容,我建议您使用 '=' 指定所有格式,而不是让 Python 默认为 '@'

<小时/>

您可以使用 struct.calcsize 检查预期大小,即:

>>> struct.calcsize('@L'), struct.calcsize('=L')

(在我的 64 位 Windows 10 计算机上返回 (4, 4),但在我的 64 位 Ubuntu 16.04 计算机上返回 (8, 4)。)

您还可以通过编译C来直接检查机器的字体大小。用于检查 sizeof(long) 值的脚本,例如:

#include <stdio.h>

int main()
{
printf("%li",sizeof(long));
return 0;
}

我关注了this guide编译C我的 Windows 10 计算机上的脚本。

关于python - long 的结构长度取决于字节顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42415983/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com