Форум сайта python.su
Доброго времени суток. Никак не могу разобраться как правильно сконвертировать строку в 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)
Офлайн
для чего?
>>> ''.join(map(lambda x:bin(ord(x))[2:],'Привет мир!'))
'110100001001111111010001100000001101000010111000110100001011001011010000101101011101000110000010100000110100001011110011010000101110001101000110000000100001'
>>> 'Привет мир!'.encode('base64')
'0J/RgNC40LLQtdGCINC80LjRgCE=\n'
Отредактировано (Апрель 26, 2011 19:28:39)
Офлайн
o7412369815963Первое пока подходит, т.к. в названии темы указал, что мне нужно двоичное представление, но как из результата снова получить строку “Привет мир!”? Цель же, произвести побитовые операции с текстом.
для чего?может base64 подойдет?>>> ''.join(map(lambda x:bin(ord(x))[2:],'Привет мир!'))
'110100001001111111010001100000001101000010111000110100001011001011010000101101011101000110000010100000110100001011110011010000101110001101000110000000100001'>>> 'Привет мир!'.encode('base64')
'0J/RgNC40LLQtdGCINC80LjRgCE=\n'
Отредактировано (Апрель 26, 2011 20:16:01)
Офлайн
>>> 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)])
Привет мир
Офлайн
Cпасибо!
Офлайн
Только иногда попадаются не совсем юникодные символы и, при попытке записать результат в файл, скрипт вываливается с
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
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)
Офлайн
> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.
Офлайн
FangЗачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?
Цель же, произвести побитовые операции с текстом.
Офлайн
o7412369815963Только так она и расшифровывается, если использую ваш пример, то получаю вышеизложенную ошибку.
> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.
Офлайн
cutwaterПытаюсь реализовать шифрование ГОСТ в режиме гаммирования.FangЗачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?
Цель же, произвести побитовые операции с текстом.
Офлайн