我在如何将霍夫曼编码字符串转换为二进制 python 时遇到问题。
这个问题与霍夫曼算法无关。
它是这样的:
我可以得到一个编码的霍夫曼字符串,比如说01010101010
。注意,它是一个字符串。
但现在我想将字符串表示形式保存为真正的二进制文件。
在霍夫曼编码的字符串中,每个 0 和 1 都是一个byte。
我想要的是每 0 和 1有点。
我怎么能在python中做到这一点?
编辑1:
请原谅我没有足够清楚地描述我的问题。
让我解释一下我目前将零写入二进制的方法。
比如说,我们可以编码字符串 s='010101010'。
- 我
int
用来将其转换为整数 - 然后用于
unichr
将其转换为字符串,以便我可以将其写入文件 - 以二进制模式将字符串写入文件
还要注意的是,我需要读取文件才能解码霍夫曼代码。
所以我的方法是,
- 从文件中读取字节
- 将它们恢复为 int
- 将 int 转换为其二进制表示字符串。
- 解码字符串
在第 2 步,问题发生了,我变得一无所知。
因为有些霍夫曼字符串可以很短(如,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
占用了两个字节。
那么,当我从文件中读取这些字节时,我应该一次读取多少字节?