我在如何将huffman编码字符串转换为二进制python时遇到了问题。在
这个问题不涉及哈夫曼算法。在
是这样的:
我可以得到一个编码的huffman字符串,比如01010101010
。注意,它是一个字符串。在
但是现在我想把字符串表示保存成真正的二进制。在
在哈夫曼编码的字符串中,每0和1都是一个字节。在
我想要的是每0和1是一个位。在
我如何在python中做到这一点呢?在
编辑1:
请原谅我没有把我的问题描述清楚。在
让我解释一下我目前写0和1到二进制的方法。在
例如,我们可以使用一个代码字符串s='010101010'。在
int
将其转换为整数unichr
将其转换为字符串,以便将其写入文件还要注意的是,我需要阅读文件,以便解码哈夫曼密码。在
所以我的方法是
在第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
占用两个字节。在
所以,当我从文件中读取这些字节时,我应该一次读取多少字节?在
有一个字符串需要转换成数字。
int
接受可选的“base”作为参数。对于你例子中的字符串一旦你有了一个数字(不是一个字符串),想要“实数”二进制是没有意义的,因为这个数字是相同的,你可以用任何基数来显示它。这意味着二进制
100
与十进制4
是相同的数字,在你的程序中它们不是不同的数字。所以,一旦你把你的字符串变成一个数字,你就可以摆弄其中的位。在在Python中有两种不同的“二进制”表示法,您可能希望使用它们。在
大块头
一个是“bignum”或任意精度整数。这种类型在python2.x中称为
long
,在python3.x中称为int
。顾名思义,这种表示在语义上是任意长度的整数,因此如果您计划对结果的数字进行算术运算,那么它非常有用。要解析二进制数字字符串,请使用或者
^{pr2}$bitstring
库或者,正如Marc B在评论中建议的那样,使用^{} library 。具体来说,对于转换,使用^{} function 。在
对于哈夫曼编码,使用
bitstring
可能比将数据存储在byte
-字符串中更好,因为哈夫曼代码通常不是8位的倍数;bitstring
允许您操作任意长度的位串。缺点:bitstring
不是标准库的一部分。在一种可能的方法(使用位字符串库),这有一定的道理,但仍包含不正确的地方:
使用位串库(感谢机械蜗牛和Marc B)
用于写入文件。在
步骤:
阅读:
代码:
相关问题 更多 >
编程相关推荐