在Python中将ASCII写入二进制序列
我正在实现哈夫曼算法,但当我得到最终的压缩代码时,得到的字符串类似于下面这个:
10001111010010101010101
这是通过我树的叶子路径生成的二进制代码。
我有这个序列,但当我把它保存到文件里时,系统只是把它当作ASCII格式保存,这样我就无法压缩,因为文件的大小和原始文件一样大,甚至更大。
我该如何直接保存这个二进制数据呢?
另外,如果我使用某个函数把我的字符串转换成二进制,得到的只是我的ASCII转换成的二进制,这样我并没有真正解决问题,我需要一个真正的解决方案。
2 个回答
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()
这种方法还会写入一些前导零,这可能会对你的哈夫曼编码造成问题。
1
你需要做的是把每8个比特(也就是0和1的组合)转换成一个字节,然后写出来。这个过程要一直循环,直到剩下的比特少于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