【问题标题】:struct.unpack returning very large value pythonstruct.unpack 返回非常大的值 python
【发布时间】:2021-02-01 20:52:50
【问题描述】:

我觉得这应该很简单,因为它很简单,我无法理解为什么它不起作用。

我有一个基本函数,它使用 struct.unpack 将字节数组转换为整数。所以我们可以在十六进制表示法中看到 x90 = 十进制的 144。所以我希望如果我要求 unpack 转换为整数,我会得到 144,但我会得到这个大得离谱的数字。我很乐意阅读您可以提供的任何参考资料,因为 struct documentation 没有提供任何线索。

请看下面的例子:

unpack_signed_integer, = struct.unpack('i', b'\x00\x00\x00\x90')
unpack_unsigned_integer, = struct.unpack('I', b'\x00\x00\x00\x90')

print(f"signed integer: {unpack_signed_integer}")
print(f"unsigned integer: {unpack_unsigned_integer}")

输出:

signed integer: -1879048192
unsigned integer: 2415919104

【问题讨论】:

    标签: python arrays python-3.x struct unpack


    【解决方案1】:

    您正在解压值 0x90_00_00_00,即小端顺序的 64 位数字。它很大,因为它有 7 个十六进制零,每个零代表 16 的幂。

    要么颠倒你的字节顺序,要么pick a different byte order

    >>> import struct
    >>> struct.unpack('I', b'\x00\x00\x00\x90')
    (2415919104,)
    >>> struct.unpack('I', b'\x90\x00\x00\x00')
    (144,)
    >>> struct.unpack('>I', b'\x00\x00\x00\x90')
    (144,)
    

    在上面的例子中,'>I' 中的 > 告诉 struct.unpack() 使用 big-endian 排序。如果您正在处理从某个网络协议接收到的数据,您可能应该改用!,它代表IETF RFC 中网络通信的默认字节顺序;这与> big-endian 顺序相同,但已编入代码以避免混淆。

    假定没有明确的字节顺序标记,@native 字节顺序。在您的特定情况下,您的机器本机字节顺序是 little-endian,但这是您计算机的特定机器架构的属性,而不是 Python 的属性。

    【讨论】:

    • 该死的。而已!看,我知道这很简单,但我只是看不到。
    【解决方案2】:

    'i''I' 格式使用您机器的本机字节顺序,在本例中为 little-endian。您可以明确说明 endianness you want to use 的内容。

    >>> struct.unpack('i', b'\x00\x00\x00\x90')  # native, implicit
    (-1879048192,)
    >>> struct.unpack('@i', b'\x00\x00\x00\x90')  # native, explicit
    (-1879048192,)
    >>> struct.unpack('<i', b'\x00\x00\x00\x90')  # explicitly little-endian
    (-1879048192,)
    >>> struct.unpack('>i', b'\x00\x00\x00\x90')  # explicitly big-endian
    (144,)
    >>> struct.unpack('!i', b'\x00\x00\x00\x90')  # explicitly network order
    (144,)
    

    网络协议使用 big-endian 作为与机器无关的排序方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 2012-12-01
      • 1970-01-01
      • 2023-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多