2014-06-23 48 views
0

我遇到了涉及加密字符串的問題。我正在做的是使用ord()函數將每個字母轉換爲數字,然後將其轉換爲二進制代碼。然後我倒置或異或的數字,以便對於字母'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 

這並不雖然數據寫入文件阻止你。

編輯

如果「擴展ASCII」你指的是該字符集http://en.wikipedia.org/wiki/Code_page_437,你應該能夠使用

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

這將返回適於印刷的unicode字符串(如果您的終端支持)。

EDIT 2

這是在Python 3.x作爲ord返回一個Unicode STR有點不同。相反,你想要一個bytes STR(這相當於一個Python2.x STR):

>>> 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 STR的數據文件,而不是UNICODE(打印)STR :

>>> 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

我剛剛試了一下在Python IDLE殼牌和它說: 「語法錯誤:無效的語法」,然後我使用打印(___)(___是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