Python struct解包整数后跟double

时间:2017-09-13 07:55:29

标签: python struct unpack

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

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

然后我尝试:

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

并且这正确地打印了数字64.但是,我还想阅读以下双,所以我修改上面的语句

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

(因为整数应该是4个字节,double应该是8,总共产生12个字节)。但是,我收到错误说

  

struct.error:unpack需要一个长度为16的字节对象

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

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

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

1 个答案:

答案 0 :(得分:0)

unpack()会自动为您填充。所以unpack('id', …)将整数填充到8个字节,这就是你得到“struct.error:unpack需要长度为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)