所以我有一个问题,我想要xor各种十六进制字符串,将它们转换为常规英语字符串,然后将它们重新转换为十六进制字符串。但是,我并不熟悉以任何有意义的方式使用hex或xor。在执行按位xor运算之前,是否需要将十六进制转换为二进制或unicode?如果是这样,一旦完成,我该如何检索十六进制值?我一直在研究使用str.encode('hex')和str.decode('hex'),但我不断收到错误,说我使用的是非十六进制字符。简而言之,我完全迷失了。
答案 0 :(得分: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'
答案 1 :(得分:1)
@ user1427661:您看到的输出与输入之一(比如input1)相同,因为 -
len(input1)> LEN(输入2)
你现在可以做的是对两个琴弦的长度进行检查,然后剥掉较大的琴弦的长度以匹配较小琴弦的大小(因为部件的其余部分无论如何都是无用的) - 就像这样 -
如果len(input1)> LEN(输入2):
input1 = input1[:len(b)]
同样是其他条件。
让我给你一个更简单的答案(在我看来是当然的!)。您可以使用内置的“运算符”包,然后直接在其中使用xor方法。
http://docs.python.org/2/library/operator.html
希望这有帮助。