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)
我正在尝试从二进制文件中解压一个结构,我知道前 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)