通过二进制操作加密字符串

时间:2014-06-23 08:52:36

标签: python string binary

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

1 个答案:

答案 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'
Ü¢£¥