我目前正在尝试使用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('
非常感谢大家!!!