将哈夫曼代码字符串转换为二进制

2024-06-16 11:35:11 发布

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

我在如何将huffman编码字符串转换为二进制python时遇到了问题。在

这个问题不涉及哈夫曼算法。在

是这样的:

我可以得到一个编码的huffman字符串,比如01010101010注意,它是一个字符串。在

但是现在我想把字符串表示保存成真正的二进制。在

在哈夫曼编码的字符串中,每0和1都是一个字节。在

我想要的是每0和1是一个。在

我如何在python中做到这一点呢?在

编辑1:

请原谅我没有把我的问题描述清楚。在

让我解释一下我目前写0和1到二进制的方法。在

例如,我们可以使用一个代码字符串s='010101010'。在

  1. 我使用int将其转换为整数
  2. 然后使用unichr将其转换为字符串,以便将其写入文件
  3. 以二进制模式将字符串写入文件

还要注意的是,我需要阅读文件,以便解码哈夫曼密码。在

所以我的方法是

  1. 从文件中读取字节
  2. 把他们恢复到智力
  3. 将int转换为它们的二进制表示字符串。在
  4. 解码字符串

在第2步,问题发生了,我变得不知所措。在

因为有些huffman字符串可以很短(比如,10),而有些可以很长(010101010101001)。这会导致它们的int值的字节长度不同( 一些短字符串可能只需要一个字节,而长字符串可能需要两个甚至更多 )在

以下代码说明了我的问题:

ss=['010101','10010101010'] 
# first one is short and takes only one byte in its int value
# second one is long and takes two bytes   

print 'write it to file'
with open('binary.bin','wb') as f:
    for s in ss:
        n=int(s,2)
        print n
        s=unichr(n)
        f.write(s)

print 'read it to file'
with open('binary.bin','rb') as f:
    for s in f.read(): 
        print ord(s)

我正在用部分在第二个读取一个字节,但这实际上是不正确的。因为字符串10010101010占用两个字节。在

所以,当我从文件中读取这些字节时,我应该一次读取多少字节?在


Tags: 文件方法字符串代码in编码字节二进制
3条回答

有一个字符串需要转换成数字。int接受可选的“base”作为参数。对于你例子中的字符串

>>> int('01010101010', 2)
682

一旦你有了一个数字(不是一个字符串),想要“实数”二进制是没有意义的,因为这个数字是相同的,你可以用任何基数来显示它。这意味着二进制100与十进制4是相同的数字,在你的程序中它们不是不同的数字。所以,一旦你把你的字符串变成一个数字,你就可以摆弄其中的位。在

在Python中有两种不同的“二进制”表示法,您可能希望使用它们。在

大块头

一个是“bignum”或任意精度整数。这种类型在python2.x中称为long,在python3.x中称为int。顾名思义,这种表示在语义上是任意长度的整数,因此如果您计划对结果的数字进行算术运算,那么它非常有用。要解析二进制数字字符串,请使用

# Python 2
long(digit_str, 2)

或者

^{pr2}$

bitstring

或者,正如Marc B在评论中建议的那样,使用^{} library。具体来说,对于转换,使用^{} function。在

对于哈夫曼编码,使用bitstring可能比将数据存储在byte-字符串中更好,因为哈夫曼代码通常不是8位的倍数;bitstring允许您操作任意长度的位串。缺点:bitstring不是标准库的一部分。在

一种可能的方法(使用位字符串库),这有一定的道理,但仍包含不正确的地方:

使用位串库(感谢机械蜗牛Marc B

用于写入文件。在

步骤:

  1. 将纯文本编码为二进制表示字符串
  2. 将所有这些字符串串联起来形成一个较长的字符串
  3. 使用bitstring.BitArray位串转换为十六进制格式
  4. 将十六进制字符串写入文件

阅读:

  1. 从文件中读取十六进制字符串
  2. 使用位数组将其转换回位字符串
  3. 开始解码

代码:

ss=['01010100','10010101010','010101110101010101'] #encoded message


from bitstring import BitArray,BitStream
print 'write it to file'
with open('binary.bin','wb') as f:
    s=''.join(ss);
    b=BitArray(bin=s)                 
    f.write(b.tobytes())# thanks to Scott, tobytes() method is very useful

print 'read it to file'
b=BitArray(filename='binary.bin')
print b.bin

相关问题 更多 >