2014-06-23 3 views
0

У меня возникла проблема с использованием шифрования строк. То, что я делаю, преобразует каждую букву в числа, используя функцию ord(), а затем преобразует ее в двоичные коды. Который я затем инвертирую или xor числа, так что для буквы «A», которая имеет двоичный код «0100 0001», станет «1011 1110», когда преобразованное обратно в десятичное значение будет 190, которое я буду chr() обратно в письмо. Я заметил, что некоторые буквы не преобразуются в какие-либо символы, которые можно увидеть вообще. Когда я попытался преобразовать десятичное значение 157 в ASCII персонаж. Я получил «\x9d» вместо значения ASCII. Согласно расширенным кодам ASCII, он должен был дать мне символ, который я могу читать с функцией печати, а также печатать его в файле. Есть ли способ сделать Python печатать его в читаемом символе, чтобы я мог его распечатать? Прямо сейчас я не могу заставить его работать из-за неспособности программы распечатать его в символы, которые я могу прочитать и изменить процесс.шифрование строки с помощью двоичной манипуляции

ответ

0

Python по умолчанию показывает представление строк, если вы явно не печатаете их. \x9d является repr (представление) символа, если распечатать его, вы увидите что-то другое в зависимости от того, какой кодировки шрифта и ваш терминал использует

>>> chr(157) 
'\x9d' 
>>> print repr(chr(157)) # equivalent to the above 
'\x9d' 
>>> print chr(157) 
� # this appears as a question mark in a diamond shaped box on my system 

Это не остановит вас от записи данных в файл, хотя ,

EDIT

Если на «Расширенная ASCII» вы имеете в виду на этот набор символов http://en.wikipedia.org/wiki/Code_page_437, вы должны быть в состоянии использовать

>>> print chr(157).decode('CP437') 
¥ 

Это возвращает юникод строку, подходящую для печати (если ваш терминал поддерживает это).

EDIT 2

Это немного отличается в Python 3.x, как ord возвращает юникод ул. Вместо этого вы хотите bytes ули (что эквивалентно ул Python2.x):

>>> bytes([157]) # this is equivalent to ord(157) in Python 2.x 
b'\x9d' 
>>> bytes([157]).decode('cp437') # decode this to a unicode str with the desired encoding 
'¥' 
>>> print(bytes([157]).decode('cp437')) # now it's suitable for printing 
¥ 

Убедитесь, что при записи данных в файл, который вы пишете необработанный bytes ул, не юникод (версия для печати) ул :

>>> data = bytes([154, 155, 156, 157]) 
>>> print (data.decode('cp437')) # use decode for printing 
Ü¢£¥ 
>>> with open('output.dat', 'wb') as f: 
...  f.write(data) # but not for writing to a file 
... 
4 
>>> with open('output.dat', 'rb') as f: 
...  data = f.read() 
...  print(data) 
...  print(data.decode('cp437')) 
... 
b'\x9a\x9b\x9c\x9d' 
Ü¢£¥ 
+0

Я просто попытался его в питон IDLE Shell и он сказал "SyntaxError: неверный синтаксис", я затем попытался с помощью печати (___) (___ будучи CHR (157) .decode ('CP437') , он также не работал. Он сказал, что объект AttributeError: 'str' не имеет никакого атрибута 'decode', и я попытался сделать это без печати. ​​Такая же проблема. str не имеет декодирования. Я использую Python IDLE 3.3. 2, я знаю, что он отличается аренду с 2.x python. Какие-либо предложения? Я использовал как dir, так и help, в chr() не было декодирования или кодирования. – user3444888

+0

@ user3444888 Я обновил ответ с кодом для Python 3.x –

+0

Спасибо! Это сработало! Есть ли способ отменить его? Когда я попытался использовать ord(), он дал 165, но начальное значение было 157. – user3444888

Смежные вопросы