首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >struct.pack()的不同行为

struct.pack()的不同行为
EN

Stack Overflow用户
提问于 2020-03-29 15:00:36
回答 1查看 35关注 0票数 0

当我试图在我的计算机和学校的服务器上运行相同的程序时,我从struct.pack(...)得到了这两种不同的行为。

这是我电脑里的

代码语言:javascript
复制
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'

这是我学校服务器上的

代码语言:javascript
复制
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(...)输出的长度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-29 15:29:05

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

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

为了更好的理解,请看一下这个page

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

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

代码语言:javascript
复制
python -c 'import struct;print( 8 * struct.calcsize("P"))'

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60911110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档