我正在尝试使用霍夫曼压缩算法压缩文本文件。我的文字是“ go go gophers”(当然是出于测试目的)。我完成了创建霍夫曼树和代码的工作,并用霍夫曼代码替换了我的文本。我得到了如下所示的编码文本。
我意识到我的字符串或整数霍夫曼代码大于我的实际原始文本。我想如果我将霍夫曼字符串(或整数)转换为字节,然后创建一个使用霍夫曼整数写入文件的文件,该怎么办?
我正在尝试使用二进制代码压缩文件,以使我的代码长度实际上为6个字节(我的二进制整数的长度/ 8)。有什么方法可以将我的二进制整数转换为实际字节,然后将其编码为新文件?我的意思是我的二进制整数的每个单独字符都将被视为文件中的一位。这可能吗?有没有不使用bytearray()的更好的选择?
代码:
print("Index: ", Index) # The Index
# Subsituting text to our compressed index
for x in range(len(TextTest)):
TextTest[x]=Index[TextTest[x]]
NewText=''.join(TextTest)
Excess = int(8-(len(NewText)%8))
NewText= NewText+ '0'*Excess
print("Encoded Text in bits:",NewText)
print('Assuming each huffman code is a bit, the Compressed text will have the length of :',len(NewText)/8 ,"bytes")
print("The size of the integer code is :",sys.getsizeof(int(NewText)),'bytes')
print("Size of index is:",sys.getsizeof(str(Index)))
print("This is a total compression text size of:",sys.getsizeof(str(Index))+len(NewText)/8)
Compressed=open("Compressed.bin",'w+')
输出:
(“原始文件大小:”,279,“字节”) {'g':3,'o':3,'':3,'p':1,'h':1,'e':1,'r':1,'s':1} 索引:{'o':'00','':'01','s':'100','p':'1010','h':'1011', 'e':'1100','r':'1101','g':'111'} 编码的文本位:111000111100011110010101011110011011000100000000 假设每个霍夫曼码都是一点,则压缩文本的长度为:6.0字节 整数代码的大小为:40个字节 索引的大小是:147 总的压缩文本大小为:153.0 文字已压缩!