我遇到了涉及加密字符串的问题。我正在做的是使用ord()
函数将每个字母转换为数字,然后将其转换为二进制代码。然后我将其反转或xor数字,以便字母“A
'其二进制代码为' 0100 0001
'将成为' 1011 1110
'当转换回十进制值时将是190
,我将chr()返回到一个字母。我注意到某些字母不会转换成任何可以看到的符号。当我尝试将157
的十进制值转换为ASCII
字符时。我得到了\x9d
'而不是ASCII值。根据扩展的ASCII代码,它应该给我一个符号,我可以用打印功能读取,并将其打印到文件。有没有办法让Python将其打印成可读符号,以便我可以打印它?现在由于程序无法将其打印成我可以阅读和反转过程的符号,我无法使其正常工作。
答案 0 :(得分: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字符串(如果您的终端支持)。
编辑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'
Ü¢£¥