在IDLE、Python 3.6.5和Python 2.7.15中,我遇到了一个与XOR相关的奇怪问题。在Python 2.7中,我得到了正确的答案,而在Python 3.6中,却得到了垃圾结果。Python 3.6和2.7对于一个简单的XOR操作的结果并不一致。这不是IDLE的问题,因为在cygwin中的表现也是相同的。
>>> ciphertext
'466d06ece998b7a2fb1d464fed2ced7641ddaa3cc31c9941cf110abbf409ed39598005b3399ccfafb61d0315fca0a314be138a9f32503bedac8067f03adbf3575c3b8edc9ba7f537530541ab0f9f3cd04ff50d66f1d559ba520e89a2cb2a83'
Python 2.7
>>> ciphertext.decode('hex')
'Fm\x06\xec\xe9\x98\xb7\xa2\xfb\x1dFO\xed,\xedvA\xdd\xaa<\xc3\x1c\x99A\xcf\x11\n\xbb\xf4\t\xed9Y\x80\x05\xb39\x9c\xcf\xaf\xb6\x1d\x03\x15\xfc\xa0\xa3\x14\xbe\x13\x8a\x9f2P;\xed\xac\x80g\xf0:\xdb\xf3W\\;\x8e\xdc\x9b\xa7\xf57S\x05A\xab\x0f\x9f<\xd0O\xf5\rf\xf1\xd5Y\xbaR\x0e\x89\xa2\xcb*\x83'
>>> for x, y in zip(ciphertext.decode('hex'), ' '*10):
print "ord(x): " + chr(ord(x))
print "ord(y): " + chr(ord(y))
print(chr(ord(x) ^ ord(y)))
ord(x): F
ord(y):
f
ord(x): m
ord(y):
M
ord(x):
ord(y):
&
ord(x): ì
ord(y):
Ì
ord(x): é
ord(y):
É
ord(x): ˜
ord(y):
¸
ord(x): ·
ord(y):
—
ord(x): ¢
ord(y):
‚
ord(x): û
ord(y):
Û
ord(x):
ord(y):
=
Python 3.6
>>> bytes.fromhex(ciphertext)
b'Fm\x06\xec\xe9\x98\xb7\xa2\xfb\x1dFO\xed,\xedvA\xdd\xaa<\xc3\x1c\x99A\xcf\x11\n\xbb\xf4\t\xed9Y\x80\x05\xb39\x9c\xcf\xaf\xb6\x1d\x03\x15\xfc\xa0\xa3\x14\xbe\x13\x8a\x9f2P;\xed\xac\x80g\xf0:\xdb\xf3W\\;\x8e\xdc\x9b\xa7\xf57S\x05A\xab\x0f\x9f<\xd0O\xf5\rf\xf1\xd5Y\xbaR\x0e\x89\xa2\xcb*\x83'
>>> for x, y in zip(bytes.fromhex(ciphertext), ' '*10):
print("x: ", chr(x))
print("ord(y): ", chr(ord(y)))
print(chr(x^ord(y)))
x: F
ord(y):
f
x: m
ord(y):
M
x:
ord(y):
&
x: ì
ord(y):
Ì
x: é
ord(y):
É
x:
ord(y):
¸
x: ·
ord(y):
<- different value
x: ¢
ord(y):
<- different value
x: û
ord(y):
Û
x:
ord(y):
=
In a cygwin window I get the following:
$ ./python2_test.py
Fm▒阷▒▒FO▒,▒vAݪ<▒▒A▒
f▒▒Y▒R▒▒▒*▒▒▒9▒ϯ▒▒▒▒▒▒▒2P;▒g▒:▒▒W\;▒ܛ▒▒7SA▒▒<▒O▒
ord(x): F
ord(y):
f
ord(x): m
ord(y):
M
ord(x):
ord(y):
&
ord(x): ▒
ord(y):
▒
ord(x): ▒
ord(y):
▒
ord(x): ▒
ord(y):
▒
ord(x): ▒
ord(y):
▒
ord(x): ▒
ord(y):
▒
ord(x): ▒
ord(y):
▒
ord(x):
ord(y):
=
$ ./python3_test.py
b'Fm\x06\xec\xe9\x98\xb7\xa2\xfb\x1dFO\xed,\xedvA\xdd\xaa<\xc3\x1c\x99A\xcf\x11\n\xbb\xf4\t\xed9Y\x80\x05\xb39\x9c\xcf\xaf\xb6\x1d\x03\x15\xfc\xa0\xa3\x14\xbe\x13\x8a\x9f2P;\xed\xac\x80g\xf0:\xdb\xf3W\\;\x8e\xdc\x9b\xa7\xf57S\x05A\xab\x0f\x9f<\xd0O\xf5\rf\xf1\xd5Y\xbaR\x0e\x89\xa2\xcb*\x83'
x: F
ord(y):
f
x: m
ord(y):
M
x:
ord(y):
&
x: ì
ord(y):
Ì
x: é
ord(y):
É
x:
ord(y):
¸
x: ·
ord(y):
<- missing
x: ¢
ord(y):
<- missing
x: û
ord(y):
Û
x:
ord(y):
=
任何帮助解决这个问题,将不胜感激。 谢谢。
chr
所使用的编码,因为如果您不使用它,就不会有任何区别。在您的新示例中,如果返回数组而不是字符串并打印十六进制值,则可以获得正确的输出。请参见Python2和Python3。 - bracco23