通过Python实现4字节32位二进制转换为十进制单精度浮点数

与底层设备做通讯,无论是串行通讯还是TCP,经常遇到以字节形式传输的数据格式,得到底层报文后的数据解析就成了重点。

这个百度求解的过程真是一言难尽,大部分都是复制粘贴,不知所云。

这里将最终结果记录一下。

32位二进制是4个字节,从左到右位0~31,设备间传输格式可能不同,到时候注意高低字节转换。
其中最高位bit0是符号位,0位整数,1位负数。
往后数8位,bit1~bit8是幂指数,意思就是这个byte的二进制数转成整数,然后减去127,所得的这个值m,就是2的m次方。
剩下的位是小数,从左到右开始依次数下去,第n位是1就累加上2的-n次方。
把这三个数相乘就是最终结果。

def float_t(b):
	b = b.replace(" ","")  # 去除空格,测试用方便
	x = bin(eval('0x'+b))[2:] # 直接不能转,加0x才认
	if (len(x)<32): # 简单的补0操作
		x =  '0'*(32-len(x)) + x
	else:
		x = x
	if int(x[0])==1: # 符号位判断
		sign = -1
	else:
		sign = 1
	mi = 2 ** (int(x[1:9], 2)-127) # 幂指数
	xiao = 1
	for num,i in enumerate(x[9:]): # 小数部分,是1的位做2的-n次方全部累加
		if i == '1':
			xiao = 2**(-(num+1)) + xiao
	return sign * mi * xiao

	# 这就是自制的32bit转float函数了
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值