Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python异或错误_Python_Python 3.x_Xor_Bits - Fatal编程技术网

Python异或错误

Python异或错误,python,python-3.x,xor,bits,Python,Python 3.x,Xor,Bits,这是一小段代码,过去它自己工作,但当我尝试在代码中实现它时,它给了我一个错误,我认为这是因为我在s2中变异了位,没有binascii.a2bqp,还有其他方法可以实现XOR s3吗 def xor(s1,s2): s3 =''.join(chr(i^j) for i,j in zip(s1,s2)) s4 = binascii.a2b_qp(s3) s5 = ''.join(chr(i^j) for i,j in zip(s2,s4)) print(s5) #

这是一小段代码,过去它自己工作,但当我尝试在代码中实现它时,它给了我一个错误,我认为这是因为我在s2中变异了位,没有binascii.a2bqp,还有其他方法可以实现XOR s3吗

def xor(s1,s2):
    s3 =''.join(chr(i^j) for i,j in zip(s1,s2))
    s4 = binascii.a2b_qp(s3)
    s5 = ''.join(chr(i^j) for i,j in zip(s2,s4))
    print(s5)

# for testing:
# additional info, s1 is a mutated form of bits from s2 using an S box
s1 = b'\xc3\xbf\x00\x00\xc3\xbf\x00\xc3\xbf\x00\x00'
s2 = b'aaaaaaaa'
xor(s1, s2)
回溯:

Traceback (most recent call last): 
  File "C:\Users\Pavilion g7\workspace\Python Network\RW.py", line 138, in <module> 
    x= xor(m1,m2) 
  File "C:\Users\Pavilion g7\workspace\Python Network\RW.py", line 69, in xor 
    s4 = binascii.a2b_qp(s3) 
ValueError: string argument should contain only ASCII characters
回溯(最近一次呼叫最后一次):
文件“C:\Users\Pavilion g7\workspace\Python Network\RW.py”,第138行,在
x=xor(m1,m2)
文件“C:\Users\Pavilion g7\workspace\Python Network\RW.py”,第69行,xor格式
s4=binascii.a2b_qp(s3)
ValueError:字符串参数应仅包含ASCII字符

如前所述,
chr()
返回一个字符串

在中,您可以获得有关如何更换它的建议

类似地,您不应该使用
.join()
作为空字符串,而应该使用
b'
作为空字节对象

例如:

def bchr(i):
    return bytes([i])

def xor(s1,s2):
    return b''.join(bchr(i ^ j) for i, j in zip(s1, s2))

s1 = b'\xc3\xbf\x00\x00\xc3\xbf\x00\xc3\xbf\x00\x00'
s2 = b'aaaaaaaa'
s3 = xor(s1, s2)
s4 = binascii.a2b_qp(s3)
s5 = xor(s2, s4)
print(s5)
s5
仍然不是
s1
,这是因为
s2
太短了。换成

s2 = b'a' * len(s1)
你就完了。现在,它也适用于

s5 = xor(s2, s3)
print(s5 == s1) # -> True

这样就完全不需要
binascii
之类的东西了。

你给它什么样的输入会触发这个错误?如果你能显示整个错误跟踪,而不仅仅是错误消息,这会更有帮助。@Newbie以前是Python 2上的代码,现在你正在Python 3上使用它?在两个版本之间,
chr
的行为发生了变化;在Python3中,它返回一个
str
(即unicode)。等等,在
i^j
中,是否对两个字符串进行异或运算?不,我从一开始就在使用python 3,下面是我在其他地方实现的代码。我很确定s1和s2的位数相同,因为当我实现反向Sbox s1时,结果是s2block=b'aaaaaa'binary=getBin(block)s1=initialPerm(binary)s2=inversePerm(s1)m1=bitsToString(s1)m2=位字符串(s2)打印(m1)打印(m2)b'\xc3\xbf\x00\x00\xc3\xbf\x00\xc3\xbf\x00\x00'b'AAAAA'11个字节有88位,8个字节有64位。我不知道为什么
s1
block
长……是的,你的方法工作正常,我的方法bitsToString为我的消息添加了3个字节我不知道如何或为什么,但当我在其中将chr切换为bchr时,它停止了这种开销,所以从技术上讲chr破坏了我代码中的2个方法。非常感谢您的帮助。我对python真的很陌生,我有点麻烦您:)