Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2011 17:49:25

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

Доброго времени суток. Никак не могу разобраться как правильно сконвертировать строку в bin. Пока пользуюсь конструкцией вида:

def convert_to_bin(): #в бин через hex
bin_list=[]
hex_list=[]
for txt_str in txt_file:
toHex = lambda string:"".join([hex(ord(char))[2:].zfill(2) for char in string])
hex_list.append(toHex(txt_str))
for item in hex_list:
bin_list.append(bin(int(item,16))[2:])
return bin_list

#и обратно
i = bin(int(str(data),16))[2:]
i_h = hex(int(i,2))[2:][:-1]
for char in range(0,len(i_h),2):
char_list.append(chr(int(i_h[char:char+2],16)))
Но, к сожалению, такое решение не работает при больших строках и в итоге получаю квадраты вместо символов. Подскажите более корректное решение.



Отредактировано (Апрель 26, 2011 17:49:45)

Офлайн

#2 Апрель 26, 2011 19:24:13

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

для чего?

>>> ''.join(map(lambda x:bin(ord(x))[2:],'Привет мир!'))
'110100001001111111010001100000001101000010111000110100001011001011010000101101011101000110000010100000110100001011110011010000101110001101000110000000100001'
может base64 подойдет?
>>> 'Привет мир!'.encode('base64')
'0J/RgNC40LLQtdGCINC80LjRgCE=\n'

Отредактировано (Апрель 26, 2011 19:28:39)

Офлайн

#3 Апрель 26, 2011 20:15:41

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

o7412369815963
для чего?

>>> ''.join(map(lambda x:bin(ord(x))[2:],'Привет мир!'))
'110100001001111111010001100000001101000010111000110100001011001011010000101101011101000110000010100000110100001011110011010000101110001101000110000000100001'
может base64 подойдет?
>>> 'Привет мир!'.encode('base64')
'0J/RgNC40LLQtdGCINC80LjRgCE=\n'
Первое пока подходит, т.к. в названии темы указал, что мне нужно двоичное представление, но как из результата снова получить строку “Привет мир!”? Цель же, произвести побитовые операции с текстом.



Отредактировано (Апрель 26, 2011 20:16:01)

Офлайн

#4 Апрель 26, 2011 21:42:46

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

>>> s = ''.join(map(lambda x:"{0:0>{1}}".format(bin(ord(x))[2:], 16), u'Привет мир'))
>>> s
'0000010000011111000001000100000000000100001110000000010000110010000001000011010100000100010000100000000000100000000001000011110000000100001110000000010001000000'
>>> print u''.join([unichr(int(s[16*i:(i+1)*16],2)) for i in xrange(len(s)/16)])
Привет мир

Офлайн

#5 Апрель 26, 2011 21:48:25

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

Cпасибо!



Офлайн

#6 Апрель 26, 2011 22:16:07

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

Только иногда попадаются не совсем юникодные символы и, при попытке записать результат в файл, скрипт вываливается с

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
Как это пофиксить?

UPD:
Пардон, разобрался. Надо было:
char_list.append(''.join([chr(int(datamas[16*i:(i+1)*16],2)&0xFF) for i in xrange(len(datamas)/16)]))



Отредактировано (Апрель 26, 2011 22:26:44)

Офлайн

#7 Апрель 27, 2011 06:11:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.

Офлайн

#8 Апрель 27, 2011 09:26:03

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

Fang
Цель же, произвести побитовые операции с текстом.
Зачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?



Офлайн

#9 Апрель 27, 2011 12:05:23

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

o7412369815963
> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.
Только так она и расшифровывается, если использую ваш пример, то получаю вышеизложенную ошибку.



Офлайн

#10 Апрель 27, 2011 12:07:04

Fang
От:
Зарегистрирован: 2009-11-15
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Конвертировать строку в двоичное представление и обратно

cutwater
Fang
Цель же, произвести побитовые операции с текстом.
Зачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?
Пытаюсь реализовать шифрование ГОСТ в режиме гаммирования.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version