通过二进制操作加密字符串
我遇到了一个关于加密字符串的问题。我现在的做法是用 ord()
函数把每个字母转换成数字,然后再把这些数字转换成二进制代码。接着,我会对这些数字进行反转或者异或操作,比如字母 'A
' 的二进制代码是 '0100 0001
',经过处理后变成 '1011 1110
',再转换回十进制就是 190
,然后我用 chr()
把它变回字母。
我发现有些字母转换后根本看不到任何符号。当我尝试把十进制值 157
转换成 ASCII
字符时,得到的是 '\x9d
',而不是一个可以识别的 ASCII 值。根据扩展 ASCII 码,它应该给我一个可以用打印函数显示的符号,并且也能打印到文件里。请问有没有办法让 Python 打印出一个可读的符号,这样我就能把它打印出来?现在我无法做到这一点,因为程序不能把它打印成我能看懂的符号,也无法逆向这个过程。
1 个回答
1
在Python中,默认情况下会显示字符串的表示形式,除非你明确地打印它。\x9d
是这个字符的表示方式,如果你打印出来,看到的内容会根据你的终端使用的编码和字体而有所不同。
>>> 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字符串。你需要的是bytes
字符串(这相当于Python 2.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
字符串,而不是unicode(可打印的)字符串:
>>> 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'
Ü¢£¥