如何在Python中使用实际位进行编码?

如何在Python中使用实际位进行编码?,python,compression,bits,huffman-code,encoder,Python,Compression,Bits,Huffman Code,Encoder,我用Python构建了一个huffman编码器,但是因为我将位(代表字符)存储为字符串,所以编码的文本比原始文本大。如何使用实际位正确压缩文本?您可以将1s和0s的str转换为int类型变量,如下所示: >>> int('10110001',2) 177 >>> format(177,'b') '10110001' >>> foo = 0b10110001 >>> foo 177 您可以将ints转换回strs的1s和

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

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

>>> int('10110001',2)
177
>>> format(177,'b')
'10110001'
>>> foo = 0b10110001
>>> foo
177
您可以将
int
s转换回
str
s的1s和0s,如下所示:

>>> int('10110001',2)
177
>>> format(177,'b')
'10110001'
>>> foo = 0b10110001
>>> foo
177
另外,请注意,您可以使用前导的
0b
以二进制形式编写
int
文本,如下所示:

>>> int('10110001',2)
177
>>> format(177,'b')
'10110001'
>>> foo = 0b10110001
>>> foo
177
现在,在你说“不,我要的是比特,不是整数”之前,先想一想。
int
变量不作为数字的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'

最后,如果您不熟悉该
{}
和第二种
格式,请继续阅读。

欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。在这里申请。StackOverflow不是设计、编码、研究或教程服务。Python有内置的位操作;你在哪里遇到了这些问题?如果字符串以零开头,那么你就会丢失它们。大多数字符串都是以0开头的-我该如何解决这个问题?