Python 3和Python 2之间的XOR函数差异?

Python 3和Python 2之间的XOR函数差异?,python,xor,Python,Xor,在IDLE、Python3.6.5和Python2.7.15中运行时,XOR有一个奇怪的问题。我用Python2.7得到正确答案,用Python3.6得到垃圾答案。Python3.6和2.7并不同意使用简单的XOR。这不是一个空闲问题,因为cygwin中的行为是相同的 >>> ciphertext '466d06ece998b7a2fb1d464fed2ced7641ddaa3cc31c9941cf110abbf409ed39598005b3399ccfafb61d0315f

在IDLE、Python3.6.5和Python2.7.15中运行时,XOR有一个奇怪的问题。我用Python2.7得到正确答案,用Python3.6得到垃圾答案。Python3.6和2.7并不同意使用简单的XOR。这不是一个空闲问题,因为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):  
=
>密文解码('hex')

'Fm\x06\xec\xe9\x98\xb7\xa2\xfb\x1dFO\xed\xedvA\xdd\xaa我认为您看到了编码问题。如果您尝试复制打印数字而不是字符的步骤,您将看不到任何区别。以下是脚本:

蟒蛇2:

ciphertext = '466d06ece998b7a2fb1d464fed2ced7641ddaa3cc31c9941cf110abbf409ed39598005b3399ccfafb61d0315fca0a314be138a9f32503bedac8067f03adbf3575c3b8edc9ba7f537530541ab0f9f3cd04ff50d66f1d559ba520e89a2cb2a83'

out1 = []
out2 = []
out3 = []
for x, y in zip(ciphertext.decode('hex'), ' '*10):
    out1.append(hex(ord(x)))
    out2.append(hex(ord(y)))
    out3.append(hex(ord(x) ^ ord(y)))
print out1
print out2
print out3
Python 3:

ciphertext = '466d06ece998b7a2fb1d464fed2ced7641ddaa3cc31c9941cf110abbf409ed39598005b3399ccfafb61d0315fca0a314be138a9f32503bedac8067f03adbf3575c3b8edc9ba7f537530541ab0f9f3cd04ff50d66f1d559ba520e89a2cb2a83'
out1 = []
out2 = []
out3 = []
for x, y in zip(bytes.fromhex(ciphertext), ' '*10):
    out1.append(x)
    out2.append(ord(y))
    out3.append(x ^ ord(y))
print(out1)
print(out2)
print(out3)
如果同时执行它们,您将看到输出是相同的

你可以直接在ideone上看到它

编辑:执行我给出的脚本,稍微修改以显示十六进制而不是原始数字,将我作为输出:

蟒蛇2:

['0x46', '0x6d', '0x6', '0xec', '0xe9', '0x98', '0xb7', '0xa2', '0xfb', '0x1d']
['0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20']
['0x66', '0x4d', '0x26', '0xcc', '0xc9', '0xb8', '0x97', '0x82', '0xdb', '0x3d']
蟒蛇3:

['0x46', '0x6d', '0x6', '0xec', '0xe9', '0x98', '0xb7', '0xa2', '0xfb', '0x1d']
['0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20']
['0x66', '0x4d', '0x26', '0xcc', '0xc9', '0xb8', '0x97', '0x82', '0xdb', '0x3d']

对于您提供的相同输入数据,我有不同的输入,但我的输出数据在Python2和Python3之间是一致的。

bracco23-感谢您的及时回复,但我在程序中得到了Python3和Python2 xor之间的差异。bracco23-感谢您的及时回复,但是在我的程序中,我发现了Python3和Python2XOR之间的差异。例如:在Python2中,我得到以下结果:[66,c9,cd,29,19,19,80,12,d0,fc,8b,bf,f0,9a],这是正确的,而在Python3中,使用相同的数据,我得到[66,c389,c38d,29,19,19,c280,12,c390,c3bc,c28b,c2bf,c3b0,c29a],这会导致错误。我不知道像“c389”这样的十六进制值在我的数据中来自何处。@JamOne我编辑了给出输出的答案,这在python2和python3之间是相同的。如果可以,请编辑您的问题并使用类似于共享可执行文件的服务(不要忘记在问题本身中包含代码)。再次感谢您的耐心等待。我已经使用了ideone服务。再次感谢您的耐心等待。我使用了ideone服务。对于Python2.6,对于Python3.4,基本上是相同的代码,Python2和Python3之间有细微的区别,但是我得到了非常不同的答案。对于2.6版本,前10个字节[66 4d 26 cc c9 b8 97 82 db 3d]。对于3.4版本,前10个字节[66 4d 26 c38c c389 c2b8 c297 c282 c39b 3d]。我根本不明白为什么会有这种差异,它在Python3.x中给出了错误的结果
['0x46', '0x6d', '0x6', '0xec', '0xe9', '0x98', '0xb7', '0xa2', '0xfb', '0x1d']
['0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20', '0x20']
['0x66', '0x4d', '0x26', '0xcc', '0xc9', '0xb8', '0x97', '0x82', '0xdb', '0x3d']