Python struct unpacking integer followed by double

Python struct unpacking integer followed by double

我正在尝试从二进制文件中解压一个结构,我知道前 4 个字节是一个整数(值为 64),接下来的 3*8 个字节是三个双精度数。我已将数据存储在一个名为 fileContent 的向量中,如下所示:

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

那我试试:

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

这正确地打印了数字 64。但是,我还想阅读下面的 double,所以我将上面的语句修改为

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

(因为整数应该是 4 个字节,双精度数应该是 8,所以总共有 12 个字节)。但是,我收到一条错误消息说

struct.error: unpack requires a bytes object of length 16

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

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

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

unpack() 会自动为您填充。所以 unpack('id', …) 会将整数填充到 8 个字节,这就是为什么你会收到 "struct.error: unpack requires a bytes object of length 16" 错误。

这样很容易看出:

>>> 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)