代码之家  ›  专栏  ›  技术社区  ›  JezuzStardust

Python结构解包整数后跟双精度

  •  0
  • JezuzStardust  · 技术社区  · 7 年前

    with open('data', mode='rb') as file: 
        fileContent = file.read()
    

    然后我尝试:

    print(struct.unpack("i", fileContent[0:4]))
    

    print(struct.unpack("id", fileContent[0:12]))
    

    (因为整数应该是4个字节,双精度应该是8,总共产生12个字节)。然而,我有一个错误,说

    此外,如果我尝试仅读取双精度并使用:

    print(struct.unpack("d", fileContent[4:12]) 
    

    我没有得到正确的双精度值!将上述切片更改为[8:16]可以得到正确的值。有人能解释一下吗?我确信文件中的前4个字节应该是整数,接下来的8个字节应该是双精度的。read()是否以某种方式将整数填充为零,或者发生了什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Julien Palard    7 年前

    这个 unpack() 将自动为您填充。所以 unpack('id', …) 将整数填充为8字节,这就是为什么会出现“struct.error:unpack需要长度为16的bytes对象”错误。

    很容易看出:

    >>> pack('id', 42, 42)
    b'*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E@'
    

    但是修复很容易,因为您知道文件的结尾,所以应该指定它,通过指定它,填充将被禁用:

    >>> unpadded = pack('>id', 42, 42)
    >>> len(unpadded)
    12
    >>> unpack('>id', unpadded)
    (42, 42.0)