我正在实施Huffman算法,但是当我得到最终的压缩代码时,我得到了类似于下面的字符串:
10001111010010101010101
这是由我的树叶的路径创建的二进制代码。
我有这个序列,但是当我将它保存在文件中时,所有发生的事情都是系统将其保存为文件上的ASCII,我无法压缩,因为它与原始文件具有相同或更大的尺寸
如何直接保存此二进制文件?
PS:如果我使用某个函数将我的字符串转换为二进制,我得到的就是将我的ASCII转换为二进制,所以我什么也没做,我需要一个真正的解决方案。
答案 0 :(得分:1)
你需要做的是取每8位并将其转换成一个字节来写出,循环直到剩下少于8位。然后将剩下的任何内容保存在前一个值的前面。
def binarize(bitstring):
wholebytes = len(bitstring) // 8
chars = [chr(int(bitstring[i*8:i*8+8], 2)) for i in range(wholebytes)]
remainder = bitstring[wholebytes*8:]
return ''.join(chars), remainder
答案 1 :(得分:0)
我认为您只希望int()
的基值为2:
my_string = "10001111010010101010101"
code_num = int( my_string, 2 )
然后写入二进制文件。 struct.pack还允许你指定你喜欢的任何字节顺序。
myfile = open("filename.txt",'wb')
mybytes = struct.pack( 'i', code_num )
myfile.write(mybytes)
myfile.close()
此方法还会写入一些前导零,这可能会给您的霍夫曼代码带来麻烦。