我试图在Python中对两个十六进制字符串进行异或,并且不知道从哪里开始。
我有两个十六进制字符串:
a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"
我应该使用它吗?
return "".join([chr((x) ^ (y)) for (x,y) in zip(a[:len(b)], b)])
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
我不明白上面两个代码的区别。为什么chr
和ord
?我也看到有人使用int(hex,16)
。
答案 0 :(得分:33)
你在这里遗漏了几件事。
首先,您不希望XOR 那些字符串。你有一个编码形式的字符串,因此,你需要首先.decode()
:
binary_a = a.decode("hex")
binary_b = b.decode("hex")
然后,如前所述,只要两个序列中的一个用尽,zip()
函数就会停止迭代。不需要切片。
您需要循环的第二个版本:首先,您需要获取字符的ASCII值:ord()
生成一个数字。这是必要的,因为^
仅适用于数字。
对数字进行异或后,您可以将数字转换回chr
的字符:
def xor_strings(xs, ys):
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(xs, ys))
xored = xor_strings(binary_a, binary_b).encode("hex")
最后使用.encode()
,我们将二进制字符串恢复为一个表格,打印得很好。
答案 1 :(得分:18)
int('', 16)
使用base 16将十六进制字符串转换为整数:
>>> int('f', 16)
15
>>> int('10', 16)
16
这样做:
result = int(a, 16) ^ int(b, 16) # convert to integers and xor them together
return '{:x}'.format(result) # convert back to hexadecimal