1

所以我有一个问题,我想对各种十六进制字符串进行异或运算,将它们转换为常规的英文字符串,然后将它们重新转换为十六进制字符串。但是,我对以任何有意义的方式使用 hex 或 xor 并不十分熟悉。在执行按位异或运算之前,是否需要将十六进制转换为二进制或 unicode?如果是这样,完成后如何检索十六进制值?我一直在研究使用 str.encode('hex') 和 str.decode('hex'),但我不断收到错误消息,说我使用的是非十六进制字符。简而言之,我完全迷路了。

4

2 回答 2

1

Python 有一个用于整数的 XOR 运算符:^. 以下是您可以使用它的方法:

>>> hex(int("123abc", 16) ^ int("def456", 16))
'0xccceea'

编辑:根据您的评论使用长十六进制字符串进行测试:

>>> def hexor(hex1, hex2):
...     """XOR two hex strings."""
...     xor = hex(int(hex1, 16) ^ int(hex2, 16))
...     return xor[2:].rstrip("L")  # get rid of "0x" and maybe "L"
... 
>>> import random
>>> a = "".join(random.choice("0123456789abcdef") for i in range(200))
>>> b = "".join(random.choice("0123456789abcdef") for i in range(200))
>>> a
'8db12de2f49f092620f6d79d6601618daab5ec6747266c2eea29c3493278daf82919aae6a72
64d4cf3dffd70cb1b6fde72ba2a04ac354fcb871eb60e088c2167e73006e0275287de6fc6133
56e44d7b0ff8378a0830d9d87151cbf3331382b096f02fd72'
>>> b
'40afe17fa8fbc56153c78f504e50a241df0a35fd204f8190c0591eda9c63502b41611aa9ac2
27fcd1a9faea642d89a3a212885711d024d2c973115eea11ceb6a57a6fa1f478998b94aa7d3e
993c04d24a0e1ac7c10fd834de61caefb97bcb65605f06eae'
>>> hexor(a, b)
'cd1ecc9d5c64cc47733158cd2851c3cc75bfd99a6769edbe2a70dd93ae1b8ad36878b04f0b0
43281e94053d689c3f5e45392af75b13702e7102fa3e0a990ca0db096fcff60db1f672561c0d
cfd849a945f62d4dc93f01ecaf30011c8a6849d5f6af293dc'
于 2012-11-13T15:45:36.430 回答
1

@ user1427661:您看到的输出与输入之一(比如输入1)相同,因为-

长度(输入1)>长度(输入2)

您现在可以做的就是检查两个字符串的长度,并用类似这样的方式剥离较大的字符串以匹配较小字符串的大小(因为该部分的其余部分无论如何都是无用的) -

如果长度(输入 1)> 长度(输入 2):

          input1 = input1[:len(b)]

同样是一个 else 条件。

让我给你一个更简单的答案(当然在我看来!)。您可以使用内置的 'operator' 包,然后直接使用其中的 xor 方法。

http://docs.python.org/2/library/operator.html

希望这可以帮助。

于 2012-11-28T03:12:56.750 回答