我想详细了解python是如何将字节转换为浮点的。
让我们创建一个只包含一个float 23.0的二进制文件:
~> echo 23 > 23.a
~> a2b < 23.a n1=1 > 23.b
现在我们编写一个python3代码23.py:
^{pr2}$执行代码:
~> python3.5 23.py
Bytes = b'\x00\x00\xb8A'
Float = (23.0,)
所以,我想知道python如何将字节'\x00\x00\xb8A'转换成float 23.0?这与DEC-BIN-HEX-ASCII表示法有关,但我已经绞尽脑汁试图理解这一点。在
DEC = 23
BIN = 0000 0000 0001 0111
HEX = 0 0 1 7
如何从中获取'\x00\x00\xb8A'?反之亦然,'\x00\x00\xb8A'如何转换为23.0?
有人能一步一步地解释我吗?谢谢。在
这显然是documented in the format table:
所以要理解这种格式,请参考IEEE floating point standard;您使用了
f
代码,所以请查找binary32, or single precision format。在此格式由32位组成,除以:
把你的二进制数据看作比特(你把它当作小尾数,所以我把它们颠倒过来,以匹配Wikipedia的big-endian排序):
我们看到符号是0,指数宽度是131(在2的补码中,所以-127等于4),有效位精度或尾数是1.4375(1+1/4+1/8+1/16,每个二进制分数都是一个启用位)。在
^{pr2}$它们一起构成实际的浮点值:
另一方面,用二进制表示整数和小数点后的值;因为二进制分数不能表示所有可能的实数,所以可能需要近似非整数部分。23.0没有非整数分量,因此这里很容易,我们只需将整数分量转换为二进制:
所以实数的二进制表示是
10111.0
。然后向上或向下移动小数点以得到1
和一个分数;这里需要将小数点上移4位到1.0111
。这将给出指数(4)和有效值(0111加上未使用分数的另外19个0)。该值为正,因此将符号编码为0
,将指数编码为有符号值(加127==131,将131编码为二进制==10000011
),并添加有效值:将其分为4组8位(4字节)得到
0x41 0xB8 0x00 0x00
。Python的repr()
输出在可能的情况下为字节提供可打印的ASCII字符,0x41
是ASCII表中的字母A
:将这些字节反转为一个小的endian表示:
您可以可视化IEEE binary32格式如何与this online converter一起工作。在
相关问题 更多 >
编程相关推荐