通过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函数了
  • 1
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论 2

打赏作者

Too_Lazy0x00

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值