【问题标题】:how to convert a float into binary using struct.unpack?如何使用 struct.unpack 将浮点数转换为二进制数?
【发布时间】:2017-09-25 16:58:44
【问题描述】:

我正在尝试将浮点数转换为二进制数。

我正在使用模块结构。例如,值为 3.5,当我执行此行时:

struct.pack('>f',3.5)

我明白了:

b'@`\x00\x00'

我想这两个 x00 x00 代表所使用的每个字节的十六进制值,但是 b 和 '@` 呢?

【问题讨论】:

  • "我正在尝试将浮点数转换为二进制。" - 你能举个例子说明“二进制”是什么意思吗?你在寻找什么样的输出?
  • 您收到的字节对象包含您需要的字节。你只是对它的显示方式感到困惑。你不需要修复任何东西。
  • @Robᵩ 基本上我想将像 3.5 这样的浮点数转换为二进制值,如:01000000011000000000000000000000(以字符串的形式)

标签: python binary


【解决方案1】:

格式字符串'>f'表示

'f' IEEE 754 binary32(4 字节,类似于 C 浮点数)

'>'big-endian字节顺序,标准大小

here 已记录在案。当表示为 ASCII 时,字符 @` 只是数字数据 (3.5) 的一部分。查看表示为二进制的这 4 个字节可能更有帮助:

>>> format(ord('@'), '08b')
'01000000'
>>> format(ord('`'), '08b')
'01100000'
>>> format(ord('\x00'), '08b')
'00000000'

如此连接为 32 位浮点数,其二进制表示形式如下:

>>> ''.join(format(x, '08b') for x in b'@`\x00\x00')
'01000000011000000000000000000000'

要手动将二进制表示转换回浮点数,请在此处阅读single-precision floating-point format,并将其拆分为组件而不是字节。这是符号位、指数(8 位无符号整数、offset-encoded)和分数(23 位):

0 10000000 11000000000000000000000

这里的指数只有 1,因为表示偏移了 127:

>>> int('10000000', 2) - 127
1

小数部分如1.112,即

>>> (2**0 + 2**-1 + 2**-2)*2
3.5

正号位 (-1)0 = 1,指数为 1,这就是数字 3.5(它恰好是可以精确地表示为浮点数)。

【讨论】:

  • 谢谢。正是我需要的。只是不能使用 format 函数,因为我们还没有了解该函数在课堂上的作用。
  • 可以从内置函数bin获取类似信息。
  • 是的。但我也不能在课堂上使用该功能。我会再次记住它,我以后可能会需要它
【解决方案2】:

没问题 - b'' 文字已经是二进制字节类型(一个古老的传统,从 2.x 开始)。

>>> struct.pack('>f',3.5)
b'@`\x00\x00'
>>> a = struct.pack('>f',3.5)
>>> type(a)
<class 'bytes'>

【讨论】:

  • 我如何解释我所看到的?
  • @oozma 这个。是。一个。不可变。可迭代。的。整数。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多