Найти - Пользователи
Полная версия: Конвертировать строку в двоичное представление и обратно
Начало » Python для новичков » Конвертировать строку в двоичное представление и обратно
1 2
Fang
Доброго времени суток. Никак не могу разобраться как правильно сконвертировать строку в 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)))
Но, к сожалению, такое решение не работает при больших строках и в итоге получаю квадраты вместо символов. Подскажите более корректное решение.
o7412369815963
для чего?

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

>>> ''.join(map(lambda x:bin(ord(x))[2:],'Привет мир!'))
'110100001001111111010001100000001101000010111000110100001011001011010000101101011101000110000010100000110100001011110011010000101110001101000110000000100001'
может base64 подойдет?
>>> 'Привет мир!'.encode('base64')
'0J/RgNC40LLQtdGCINC80LjRgCE=\n'
Первое пока подходит, т.к. в названии темы указал, что мне нужно двоичное представление, но как из результата снова получить строку “Привет мир!”? Цель же, произвести побитовые операции с текстом.
o7412369815963
>>> 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)])
Привет мир
Fang
Cпасибо!
Fang
Только иногда попадаются не совсем юникодные символы и, при попытке записать результат в файл, скрипт вываливается с
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)]))
o7412369815963
> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.
cutwater
Fang
Цель же, произвести побитовые операции с текстом.
Зачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?
Fang
o7412369815963
> Только иногда попадаются не совсем юникодные символы
в моем примере как раз все уникодное, а в вашем идет обрезание символов, таким образом кириллицу не расшифорвать.
Только так она и расшифровывается, если использую ваш пример, то получаю вышеизложенную ошибку.
Fang
cutwater
Fang
Цель же, произвести побитовые операции с текстом.
Зачем? Для побитовых операций не нужно приводить строку в двоичное представление. Что Вы пытаетесь сделать?
Пытаюсь реализовать шифрование ГОСТ в режиме гаммирования.
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