【问题标题】:Write a Binary Sequence in ASCII to Binary python将ASCII中的二进制序列写入二进制python
【发布时间】:2014-08-08 22:02:40
【问题描述】:

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

10001111010010101010101

这是由我的树叶路径创建的二进制代码。

我有这个序列,但是当我将它保存在一个文件中时,所发生的只是系统将它作为 ASCII 保存在一个文件中,我无法压缩它,因为它的大小与原始大小相同或更大。

如何直接保存这个二进制文件?

PS:如果我使用一些函数将我的字符串转换为二进制,我得到的只是我的 ASCII 转换为二进制,所以我什么也没做,我需要一个真正的解决方案。

【问题讨论】:

  • 这应该写成多少字节?大端还是小端?
  • 您可以使用我的this 中提到的Bitwise I/O 配方来回答另一个关于读取位的问题。

标签: python binary compression ascii huffman-code


【解决方案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

【讨论】:

  • 如何从文件中取回这个值,因为你的解决方案已经奏效,但我不知道如何读回来。
  • @user3923894 这听起来像是另一个问题。
【解决方案2】:

我认为您只需要基值为 2 的 int()

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()

此方法还会写入一些前导零,这可能会给您的霍夫曼代码带来麻烦。

【讨论】:

  • 霍夫曼码往往是可变位数,因此您无法转换为恒定大小的整数。
  • 已编辑以允许更大的整数
最近更新 更多