python unpack转化二进制文件_python struct在转换二进制文件时“unpack需要长度为8的bytes对象”...

本文探讨了在使用Python struct模块转换二进制文件为浮点数时遇到的问题,特别是当输入字符串长度不为8时引发的错误。通过示例代码展示了从二进制到浮点数以及反之的转换过程,并分享了解决因字节编码导致的'unpack requires a bytes object of length 8'错误的方法。
摘要由CSDN通过智能技术生成

我目前正在尝试使用struct模块将二进制文件转换为float和viceversa。我的函数可以处理某些值,比如2.0或14.0,但不能处理1.0。

我把另一个问题的代码从python2改成python3。import struct

def bin_to_float(b):

""" convert binary string to float """

bf = int_to_bytes(int(b, 2), 8) # 8 bytes needed for IEEE 754 binary64

bf = bytes(bf, 'UTF-8')

print(bf)

return struct.unpack('

def int_to_bytes(n, minlen): # helper function

""" int/long to byte string """

nbits = n.bit_length() + (1 if n < 0 else 0) # plus one for any sign bit

nbytes = (nbits+7)//8 # number of whole bytes

bytes = []

for i in range(nbytes):

bytes.append(chr(n & 0xff))

n >>= 8

# zero pad if needed

if minlen > 0 and len(bytes) < minlen:

bytes.extend((minlen-len(bytes)) * '0')

bytes.reverse() # put high bytes at beginning

return ''.join(bytes)

# tests

def float_to_bin(f):

""" convert float to binary string """

ba = struct.pack('>d', f)

s = ''.join('{:08b}'.format(b) for b in ba)

# strip off leading zeros

for i in range(len(s)):

if s[i] != '0':

break

else: # all zeros

s = '0'

i = 0

return s[i:]

import math

floats = [2.0, 1.0, -14.0, 12.546, math.pi]

for f in floats:

binary = float_to_bin(f)

print ('float_to_bin(%f): %r' % (f, binary))

float = bin_to_float(binary)

print ('bin_to_float(%r): %f' % (binary, float))

print ()

问题似乎是,当我用字节编码str时,得到的是9个字节,而不是8个字节,但这种情况有时才发生。这是控制台读数:float_to_bin(2.000000): '100000000000000000000000000000000000000000000000000000000000000'

b'@\x00\x00\x00\x00\x00\x00\x00'

bin_to_float('100000000000000000000000000000000000000000000000000000000000000'): 0.000000

float_to_bin(1.000000): '11111111110000000000000000000000000000000000000000000000000000'

b'?\xc3\xb0\x00\x00\x00\x00\x00\x00'

Traceback (most recent call last):

File "C:/Users/arzuffi pc test/Desktop/prova struct.py", line 47, in

float = bin_to_float(binary)

File "C:/Users/arzuffi pc test/Desktop/prova struct.py", line 8, in bin_to_float

return struct.unpack('

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

我似乎不明白为什么会发生这种事以及如何防止它发生

有人知道为什么吗?

提前非常感谢。

编辑:J.J.哈卡拉回答得很好,所以我把答案贴在这里:import struct

def bin_to_float(b):

""" convert binary string to float """

return struct.unpack('

def float_to_bin(f):

""" convert float to binary string """

return '{:b}'.format(struct.unpack('

如果有人想对32位浮点执行同样的操作,这应该是好的:import struct

def bin_to_float(b):

""" convert binary string to float """

return struct.unpack('

def float_to_bin(f):

""" convert float to binary string """

return '{:b}'.format(struct.unpack('

非常感谢大家!!!

以下是使用Python二进制格式文件的示例代码: ```python # 打开二进制文件 with open('example.bin', 'wb') as file: # 写入一个整数 file.write(b'\x01\x02\x03\x04') # 写入一个浮点数 file.write(struct.pack('f', 3.14)) # 写入一个字符串 file.write(b'Hello, world!') # 读取二进制文件 with open('example.bin', 'rb') as file: # 读取整数 data = file.read(4) print(int.from_bytes(data, byteorder='big')) # 读取浮点数 data = file.read(4) print(struct.unpack('f', data)) # 读取字符串 data = file.read(13) print(data.decode()) ``` 在上面的代码中,我们使用了Python的内置`open`函数来打开文件(在这种情况下,文件名是`example.bin`)。我们使用`wb`参数来打开文件以进行写入操作,并使用`rb`参数来打开文件以进行读取操作。我们使用`with`语句来自动关闭文件。 我们使用`write`方法将二进制数据写入文件。在本示例中,我们写入了一个整数,一个浮点数和一个字符串。我们使用`struct.pack`方法将浮点数打包为字节串,这是因为Python不支持直接将浮点数写入二进制文件。我们使用`b`前缀将字符串转换为字节串。 在读取文件,我们使用`read`方法读取指定数量的字节。我们使用`int.from_bytes`方法将字节串转换为整数,使用`struct.unpack`方法将字节串解包为浮点数,并使用`decode`方法将字节串转换为字符串。 请注意,二进制文件中的数据可能无法阅读,因为它们以不可读的形式存储在文件中。但是,二进制格式的文件通常比文本格式的文件更节省磁盘空间,并且可以更快地读取和写入数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值