Почему бинарный файл больше?

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

Учителя на курсе не знают ответа.

Я использую это, где ciph_text — это строка из 0 и 1.

with open(full_name,'w') as temp:
    temp.write(ciph_text)

Есть идеи?
По запросу я могу опубликовать дополнительный код.


person D4N    schedule 08.01.2019    source источник
comment
потому что вы сохраняете как строку, поэтому каждый символ считается как 8 бит вместо 1   -  person BlackBear    schedule 08.01.2019
comment
также избегайте with open(full_name,'w') для двоичного кода, используйте wb   -  person Jean-François Fabre    schedule 08.01.2019
comment
Не знаю об алгоритме Хаффмана, но в любом случае: вы сохраняете двоичное представление строки, которая длиннее исходной строки, в виде данных ascii в файле? Я думаю, вы должны сохранить свои биты в несколько байтов как настоящий двоичный файл with open(full_name,'wb') as temp:   -  person SpghttCd    schedule 08.01.2019
comment
Да, вам нужно добавить больше кода к вашему вопросу, иначе мы можем только догадываться.   -  person martineau    schedule 08.01.2019
comment
@SpghttCd: используется для кодирования по методу Хаффмана.   -  person martineau    schedule 08.01.2019
comment
D4N: Предлагаю вам взглянуть на мой ответ, в котором описывается способ побитового ввода-вывода, потому что я думаю, что вы записываем полученные биты в виде текстового файла, состоящего из 0 и 1 символов, каждый из которых имеет длину не менее 8 бит, а не в виде двоичных нулей и единиц.   -  person martineau    schedule 08.01.2019
comment
У меня есть строка из 1 и 0, и я хочу сохранить ее как двоичный файл. Есть ли способ проще?   -  person D4N    schedule 24.01.2019


Ответы (1)


int(x, 2) ваш друг:

>>> a="00001010000101000001111000101000"
>>> for b in range(0, len(a), 8):
...   print a[b:b+8], int(a[b:b+8], 2)
... 
00001010 10
00010100 20
00011110 30
00101000 40
person dede    schedule 08.01.2019