对于Python 3编程作业,我必须使用霍夫曼编码。它足够简单,可以生成正确的代码,从而产生一个长0和1的字符串。
现在我的问题实际上是将这个字符串写成二进制而不是文本。我试图这样做:
result = "01010101 ... " #really long string of 0's and 1's
filewrt = open(output_file, "wb") #appending b to w should write as binary, should it not?
filewrt.write(result)
filewrt.close()
但是我仍在设置一个0和1个字符的大文本文件。我该如何解决这个问题?
编辑:似乎我只是不明白如何在Python 3中表示任意位。基于this SO question我设计了这个丑陋的怪物:
for char in result:
filewrt.write( bytes(int(char, 2)) )
它输出的零文件是我的输入文件的两倍,而不是接近工作。有人可以向我解释如何随意代表二进制文件吗?在创建一个霍夫曼树的情况下,如果不使用字符串,我该如何根据它们的叶子位置来连接或连接位。
答案 0 :(得分:1)
def intToTextBytes(n, stLen=0):
bs = b''
while n>0:
bs = bytes([n & 0xff]) + bs
n >>= 8
return bs.rjust(stLen, b'\x00')
num = 0b01010101111111111111110000000000000011111111111111
bs = intToTextBytes(num)
print(bs)
open(output_file, "wb").write(bs)
编辑:更复杂但更快(约3倍)的方式:
from math import log, ceil
intToTextBytes = lambda n, stLen=0: bytes([
(n >> (i<<3)) & 0xff for i in range(int(ceil(log(n, 256)))-1, -1, -1)
]).rjust(stLen, b'\x00')