Найти - Пользователи
Полная версия: Как записать и читать код Хаффмана в файлы
Начало » Python для новичков » Как записать и читать код Хаффмана в файлы
1
duke007
Всем привет. Реализовал шифрование методом Хаффмана. Не могу решить как сохранять кодированное сообщение в файл. Гугл не помогает.
Идея на строках (я считаю самый ужасный вариант, код представляет из себя строку “100101001…”) разбивать строку напоследовательности по 8 символов, парсить их в число, затем это число писать в файл.
Ещё вариант- код это список или кортеж с булевыми значениями LHaf. Брать так же по 8 элементов и делать что- то подобное
buff+= chr((LHaf[i])|(LHaf[i+1] << 1)|(LHaf[i+2] << 2)|(LHaf[i+3] <<3)|(LHaf[i+4] <<4)|(LHaf[i+5] <<5)|(LHaf[i+6] <<6)|(LHaf[i+7] <<7))
сохранять в строковый буффер а потом в файл

Посоветуйте пожалуйста каким образом представлять сам код и приемлимый вариант сохранения.
bw
Люблю извращенские реализации :-).
import struct
import functools as F
import operator as O
LHaf = [1, 0, 0, 1, 0, 1, 0, 0, 1]
with open('/tmp/output', 'wb') as f:
    for i in xrange(0, len(LHaf), 64):
        f.write(struct.pack('!Q', sum(map(F.partial(apply, O.lshift), zip(LHaf[i:i+64], range(64))))))

..bw
duke007
bw
import struct
import functools as F
import operator as O
LHaf = [1, 0, 0, 1, 0, 1, 0, 0, 1]
with open('/tmp/output', 'wb') as f:
    for i in xrange(0, len(LHaf), 64):
        f.write(struct.pack('!Q', sum(map(F.partial(apply, O.lshift), zip(LHaf[i:i+64], range(64))))))
Спасибо большое ) Определённо лучше моих костылей )
У меня ещё небольшой вопрос. Когда читаю из файла подобным образом
	
LHaf=[]
inpf = open(path, "rb")
while True:
        symbol = inpf.read(8)
        print len(symbol)
        if not symbol or len(symbol)!=8: break
        LHaf+=[bool(int(x)) for x in bin(unpack('!Q', symbol)[0])[2:]]
inpf.close()
в преобразовании bin() теряются старшие нулевые биты. Подскажите способ получить точь- в- точь что было в файле )
bw
q, = struct.unpack('!Q', symbol)
LHaf += [q >> i & 1 for i in range(64)]

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB