Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2013 19:45:01

duke007
Зарегистрирован: 2013-09-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать и читать код Хаффмана в файлы

Всем привет. Реализовал шифрование методом Хаффмана. Не могу решить как сохранять кодированное сообщение в файл. Гугл не помогает.
Идея на строках (я считаю самый ужасный вариант, код представляет из себя строку “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)

Офлайн

#2 Сен. 23, 2013 01:01:36

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как записать и читать код Хаффмана в файлы

Люблю извращенские реализации :-).

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



Отредактировано bw (Сен. 23, 2013 01:02:12)

Офлайн

#3 Сен. 23, 2013 19:43:31

duke007
Зарегистрирован: 2013-09-22
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать и читать код Хаффмана в файлы

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() теряются старшие нулевые биты. Подскажите способ получить точь- в- точь что было в файле )

Отредактировано duke007 (Сен. 23, 2013 19:46:14)

Офлайн

#4 Сен. 23, 2013 23:13:01

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как записать и читать код Хаффмана в файлы

q, = struct.unpack('!Q', symbol)
LHaf += [q >> i & 1 for i in range(64)]

..bw



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version