Форум сайта python.su
Всем привет. Реализовал шифрование методом Хаффмана. Не могу решить как сохранять кодированное сообщение в файл. Гугл не помогает.
Идея на строках (я считаю самый ужасный вариант, код представляет из себя строку “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))
Отредактировано duke007 (Сен. 22, 2013 20:02:21)
Офлайн
Люблю извращенские реализации :-).
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 (Сен. 23, 2013 01:02:12)
Офлайн
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()
Отредактировано duke007 (Сен. 23, 2013 19:46:14)
Офлайн
q, = struct.unpack('!Q', symbol) LHaf += [q >> i & 1 for i in range(64)]
Офлайн