gpt4 book ai didi

python - Python 结构模块长度的差异

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:24 24 4
gpt4 key购买 nike

我正在尝试使用 Python 的结构模块来解码来自 GPS 系统的一些二进制 header 。我有两种类型的标题,长的和短的,我在下面有一个阅读每一个的例子:

import struct
import binascii

packed_data_short = binascii.unhexlify('aa44132845013b078575e40c')
packed_data_long = binascii.unhexlify('aa44121ca20200603400000079783b07bea9bd0c00000000cc5dfa33')

print packed_data_short
print len(packed_data_short)

sS = struct.Struct('c c c B H H L')

unpacked_data_short = sS.unpack(packed_data_short)
print 'Unpacked Values:', unpacked_data_short

print ''

print packed_data_long
print len(packed_data_long)

sL = struct.Struct('c c c B H c b H H b c H L L H H')

unpacked_data_long = sL.unpack(packed_data_long)
print 'Unpacked Values:', unpacked_data_long

在这两种情况下,我都得到了我期望的长度——短 header 为 12 字节,长 header 为 28 字节。此外,所有字段都正确显示(据我所知,旧数据)是合理的值。到目前为止一切都很好。

我将它移到另一台计算机上(运行不同版本的 Python - 2.7.6 而不是 2.7.11),我使用 calcsize 获得不同的结构长度,并在尝试传递时遇到错误它是我计算过的长度,另一个版本也很满意。现在短 header 需要 16 个字节,长 header 需要 36 个字节。

如果我传递较大的数量,它会要求找到大部分记录,直到“L”条记录。在长示例中,第一个符合预期,但第二个应该为 0 的不正确,因此后面的两个字段也不正确。根据函数需要的字节数,我注意到每个“L”的字节数是 4,实际上只是运行 struct.calcsize('L') 我得到的长度是 8在 2.7.6 和 4 中用于 2.7.11。这至少缩小了问题所在的范围,但我不明白为什么会这样。

目前我正在将第二台计算机更新到 Python 2.7.11(一旦我拥有它就会更新),但我在结构文档中找不到任何表明对此进行了更改的内容。有什么我明显遗漏的吗?或者这只是一个版本问题?

我一直引用的文档是 here .

编辑:关于操作系统的进一步评论 - 一个是 64 位版本的 Windows 7(按预期工作的那个),第二个是 64 位版本的 Ubuntu 14.04。

最佳答案

这不是错误;见 struct documentation :

Note

By default, the result of packing a given C struct includes pad bytes in order to maintain proper alignment for the C types involved; similarly, alignment is taken into account when unpacking. This behavior is chosen so that the bytes of a packed struct correspond exactly to the layout in memory of the corresponding C struct. To handle platform-independent data formats or omit implicit pad bytes, use standard size and alignment instead of native size and alignment: see Byte Order, Size, and Alignment for details.


要解码来自该 GPS 设备的数据,您需要使用 <>在您的格式字符串中,如 7.3.2.1. Byte Order, Size, and Alignment 中所述.因为你让它在另一台机器上工作,我假设数据是小端格式,如果你使用

sS = struct.Struct('<cccBHHL')
sL = struct.Struct('<cccBHcbHHbcHLLHH')

其尺寸总是

>>> sS.size
12
>>> sL.size
28

它们为什么不同?您使用的原始计算机是 Windows 计算机或 32 位计算机,而远程计算机是 64 位 *nix。在原始尺寸中,L表示类型 unsigned long一个C编译器。在 32 位 Unixen 和所有 Windows 版本中,这是 32 位宽。

在 64 位 Unix 中,x86 上的标准 ABI 是 LP64这意味着 long指针是 64 位宽的。然而,Windows uses LLP64 ;只有long long那里是 64 位的;原因是很多代码甚至 Windows API 本身都长期依赖于 long正好是 32 位。

<旗帜存在,LI两者始终保证为 32 位。其他字段说明符没有问题,因为它们的大小在所有 x86 平台和操作系统上都保持不变。

关于python - Python 结构模块长度的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084379/

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