我试图从二进制文件解压缩结构,我知道前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()以某种方式用零填充整数,或者发生了什么?
答案 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)