Python:异或十六进制字符串

23 投票
2 回答
71419 浏览
提问于 2025-04-17 13:40

可能重复的问题:
在Python中对十六进制数字进行按位异或

我想在Python中对两个十六进制字符串进行异或操作,但不知道从哪里开始。

我有两个十六进制字符串:

a = "32510ba9a7b2bba9b8005d43a304b5714cc0bb0c8a34884dd91304b8ad40b62b07df44ba6e9d8a2368e51d04e0e7b207b70b9b8261112bacb6c866a232dfe257527dc29398f5f3251a0d47e503c66e935de81230b59b7afb5f41afa8d661cb"
b = "32510ba9babebbbefd001547a810e67149caee11d945cd7fc81a05e9f85aac650e9052ba6a8cd8257bf14d13e6f0a803b54fde9e77472dbff89d71b57bddef121336cb85ccb8f3315f4b52e301d16e9f52f90"

我应该使用这个吗?

  1. return "".join([chr((x) ^ (y)) for (x,y) in zip(a[:len(b)], b)])
  2. return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])

我不明白上面两个代码有什么区别。为什么要用 chrord?我还看到有人使用 int(hex,16)

2 个回答

20

int('', 16) 是把一个十六进制的字符串转换成整数,使用的是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
34

这里有几个要点你需要注意。

首先,你不应该直接对这些字符串进行异或运算(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(),我们可以把二进制字符串转换成一种更好看的格式。

撰写回答