Python3将字符串写为二进制

时间:2013-11-17 23:10:40

标签: python-3.x huffman-code

对于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)) )

它输出的零文件是我的输入文件的两倍,而不是接近工作。有人可以向我解释如何随意代表二进制文件吗?在创建一个霍夫曼树的情况下,如果不使用字符串,我该如何根据它们的叶子位置来连接或连接位。

1 个答案:

答案 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')