python3如何将字节转换为浮点?

2024-09-30 08:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想详细了解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?
有人能一步一步地解释我吗?谢谢。在


Tags: 文件代码pyecho字节bin二进制float
1条回答
网友
1楼 · 发布于 2024-09-30 08:18:27

这显然是documented in the format table

For the 'f' and 'd' conversion codes, the packed representation uses the IEEE 754 binary32 (for 'f') or binary64 (for 'd') format, regardless of the floating-point format used by the platform.

所以要理解这种格式,请参考IEEE floating point standard;您使用了f代码,所以请查找binary32, or single precision format。在

此格式由32位组成,除以:

  • 符号位:1位
  • 指数宽度:8位
  • 有效位精度:24位(23显式存储)

把你的二进制数据看作比特(你把它当作小尾数,所以我把它们颠倒过来,以匹配Wikipedia的big-endian排序):

>>> ('{:08b}' * 4).format(*b'\x00\x00\xb8A'[::-1])
'01000001101110000000000000000000'

我们看到符号是0,指数宽度是131(在2的补码中,所以-127等于4),有效位精度或尾数是1.4375(1+1/4+1/8+1/16,每个二进制分数都是一个启用位)。在

^{pr2}$

它们一起构成实际的浮点值:

>>> 1 * 2 ** 4 * 1.4375 (sign, positive, times 2 to the power exponent, times fractions)
23.0

另一方面,用二进制表示整数和小数点后的值;因为二进制分数不能表示所有可能的实数,所以可能需要近似非整数部分。23.0没有非整数分量,因此这里很容易,我们只需将整数分量转换为二进制:

>>> format(23, 'b')
'10111'

所以实数的二进制表示是10111.0。然后向上或向下移动小数点以得到1和一个分数;这里需要将小数点上移4位到1.0111。这将给出指数(4)和有效值(0111加上未使用分数的另外19个0)。该值为正,因此将符号编码为0,将指数编码为有符号值(加127==131,将131编码为二进制==10000011),并添加有效值:

0 10000011 01110000000000000000000

将其分为4组8位(4字节)得到0x41 0xB8 0x00 0x00。Python的repr()输出在可能的情况下为字节提供可打印的ASCII字符,0x41是ASCII表中的字母A

>>> bytes([0b01000001, 0b10111000, 0b00000000, 0b00000000])
b'A\xb8\x00\x00'

将这些字节反转为一个小的endian表示:

>>> bytes([0b01000001, 0b10111000, 0b00000000, 0b00000000])[::-1]
b'\x00\x00\xb8A'

您可以可视化IEEE binary32格式如何与this online converter一起工作。在

相关问题 更多 >

    热门问题