2017-09-13 25 views
0

我想从二进制文件中解压结构,我知道前4个字节是一个整数(值为64),接下来的3 * 8字节是三个双精度值。我已经存储的数据在一个名为fileContent这样的载体:Python结构解压缩整数后加双精度

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个字节,并且双应该是8位,产生总共12个字节)。不过,我得到一个错误,指出

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

另外,如果我尝试读取双只及用途:

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

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

+0

您的输入结构可能被填充,因此'double'对齐8个字节。 –

+0

我在终端中做了一个二进制转储,并且输入文件'data'没有被填充(考虑到在小端机器上,前四个字节是01000000 00000000 00000000 00000000)并且后面的字节非零,并且I认为他们代表了浮动。 read()函数是否会自动填充数据? – JezuzStardust

回答

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\[email protected]' 

但解决办法是容易的,因为你知道文件的存储方式,你应该指定它,并通过specifing它,填充将被禁用:

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