struct.pack() 的不同行为

Different behavior of struct.pack()

当我尝试 运行 我的计算机和我学校的服务器上的同一程序时,我从 struct.pack(...).

得到了这两种不同的行为

这是我的电脑

Python 3.7.0 (default, Oct  9 2018, 10:31:47) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import struct
>>> struct.pack('HL',0,123456)
b'\x00\x00\x00\x00\x00\x00\x00\x00@\xe2\x01\x00\x00\x00\x00\x00'

这是我学校的服务器

Python 3.7.0 (default, Aug  1 2018, 14:55:42) 
[GCC 4.8.4] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import struct
>>> struct.pack('HL',0,123)
b'\x00\x00\x00\x00\x00\x00\x00{'

如您所见,由于与 Python 版本无关的原因,两个系统的输出长度不同。有没有办法强制或强制输出为 8 或 16 字节长? HL格式实际上只有6个字节长,但在学校服务器上,它扩展为8个字节。在我的本地计算机上,'HL' 由于某种原因扩展为 16 个字节。

此行为很关键,因为稍后我需要将此函数传递给 struct.unpack(...),这将需要不同的长度输入,具体取决于 struct.pack(...).

的输出长度

您 运行 在两台不同的机器上使用相同的代码,根据您使用的 32 位或 64 位 os 解释打包的格式不同。

在 32 位和 64 位架构上,基本类型的大小不同,从而产生不同的长度。对于您的特定示例,在 64 位体系结构上是第二个。

请看一下这个 page 以便更好地理解。

我敢打赌,您在 64 位机器上执行第一个代码,在 32 位机器上执行第二个代码。

您可以 运行 此代码确定您使用的是 32 位还是 64 位体系结构。参见 here for details

python -c 'import struct;print( 8 * struct.calcsize("P"))'

它应该在第一台机器上产生 64,在第二台机器上产生 32。

事实上,如果你在同一台机器上打包和解包数据,你不会有任何问题。但是当您开始在没有任何预防措施的情况下将二进制数据从一台机器发送到另一台机器时,您会遇到问题。 (您遇到的 32/64 问题,字节顺序)。这就是为什么在使用多台机器时需要描述数据编码。 HDF5 是文件数据存储,可以帮助您解决所有这些困难。