【问题标题】:How to encode with actual bits in Python?如何在 Python 中使用实际位进行编码?
【发布时间】:2018-07-12 03:07:45
【问题描述】:

我在 Python 中构建了一个霍夫曼编码器,但是因为我将位(代表字符)存储为字符串,所以编码的文本比原始文本大。如何使用实际位正确压缩文本?

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。 StackOverflow 不是设计、编码、研究或教程服务。 Python 内置了位操作;你在哪里纠结这些?

标签: python compression bits huffman-code encoder


【解决方案1】:

您可以将 1 和 0 的 str 转换为 int 类型变量,如下所示:

>>> int('10110001',2)
177

您可以像这样将ints 转换回 1 和 0 的 strs:

>>> format(177,'b')
'10110001'

另外,请注意,您可以使用前导 0b 以二进制形式编写 int 文字,如下所示:

>>> foo = 0b10110001
>>> foo
177

现在,在你说“不,我要求的是位,而不是整数!”之前这点考虑一下吧。 int 变量不会作为数字的 base-10 表示形式存储在计算机硬件中;它直接存储为位。


编辑:Stefan Pochmann 指出这将去掉前导零。考虑:

>>> code = '000010110001'
>>> bitcode = int(code, 2)
>>> format(bitcode, 'b')
'10110001'

那么如何保留前导零呢?有几种方法。你如何处理它可能取决于你是想先将每个字符类型转换为int,然后将它们连接起来,还是在将整个字符类型转换为int之前连接1和0的字符串。后者可能会简单得多。一种适用于后者的方法是存储代码的长度,然后将其与以下语法一起使用:

>>> format(bitcode, '012b')
'000010110001'

'012b' 告诉格式化函数用足够的零填充字符串的左侧,以确保最小长度为 12。所以你可以这样使用它:

>>> code = '000010110001'
>>> code_length = len(code)
>>> bitcode = int(code, 2)
>>> format(bitcode, '0{}b'.format(code_length))
'000010110001'

最后,如果您对{} 和第二个format 不熟悉,请继续阅读string formatting

【讨论】:

  • 如果字符串以零开头,那么您将丢失它们。
  • 大部分都以 0 开头 - 我该如何补救?
猜你喜欢
  • 2021-12-16
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2010-12-11
相关资源
最近更新 更多