Python: Как преобразовать код Хаффмана int в действительные байты для сохранения в файл - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь сжать текстовый файл с помощью алгоритма сжатия Хаффмана.Мой текст был "иди иди суслики" (для целей тестирования, конечно).Я закончил создание дерева и кода Хаффмана и заменил мой текст кодом Хаффмана.Я получил мой закодированный текст, как показано ниже.

Я понял, что мой код Хаффмана в строке или целом числе больше, чем мой фактический необработанный текст.Я подумал, что если я преобразую свою строку Хаффмана (или целое число) в байты, то создаю файл, который записывает файл, используя мои целые числа Хаффмана.

Я пытаюсь сжать мой файл двоичным кодом, чтобы длина моего кода была на самом деле 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,' bytes ') {' 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. Сжатый текст!

...