在Python中将ASCII写入二进制序列

1 投票
2 回答
529 浏览
提问于 2025-04-18 16:37

我正在实现哈夫曼算法,但当我得到最终的压缩代码时,得到的字符串类似于下面这个:

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

撰写回答