我有一个程序,可以读取单精度IBM浮点数的二进制文件。目标是将这些转换为IEEE754浮点(二进制格式)。当前,我正在读取二进制IBM数字,将其转换为浮点数,然后将其转换为其IEEE754格式(单精度)。由于某种原因,我没有得到想要的输出。
我的输入:
11000010011101101010000000000000
我想要的输出:
11000010111011010100000000000000
我得到的输出:
1100000001011101101010000000000000000000000000000000000000000000
代码:
import struct
getBin = lambda x: x > 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:]
def floatToBinary64(value):
val = struct.unpack('Q', struct.pack('d', value))[0]
return getBin(val)
with open("test.bin", "rb") as f:
while True:
ibm = f.read(32);
if not ibm:
break
print(ibm)
ibm = int(ibm, 2)
sign = (ibm >> 31) & 0x01
exponent = (ibm >> 24) & 0x7f
mantissa = (ibm & 0x00ffffff) / pow(2, 24)
decimal = (1 - 2 * sign) * mantissa * float(pow(16, exponent - 64))
print(decimal)
binary = floatToBinary64(decimal)
print(binary)
如何修改此代码以获得所需的输出?
答案 0 :(得分:1)
在floatToBinary64
中,val = struct.unpack('Q', struct.pack('d', value))[0]
将double
的C value
表示形式转换为unsigned long long
。 (未严格指定Python类型; Python实现通常依赖于C实现并继承其许多属性。)在许多常见的C实现中,double
是IEEE-754基本的64位二进制格式,而{ {1}}是IEEE-754基本的32位二进制格式。
要将其更改为32位,请将其更改为float
。为此,请将例程重命名为val = struct.unpack('I', struct.pack('f', value))[0]
。