【问题标题】:Xor Hex/ASCII/Conversion IssueXor Hex/ASCII/转换问题
【发布时间】:2012-11-02 01:22:55
【问题描述】:

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

【问题讨论】:

标签: python hex xor


【解决方案1】:

Python 有一个整数异或运算符:^。以下是你可以如何使用它:

>>> 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'

【讨论】:

  • 当我这样做,大的十六进制字符串,即234c02ecbbfbafa3ed18510abd11fa724fcda2018a1a8342cf064bbde548b12b07df44ba7191d9606ef4081ffde5ad46a5069d9f7f543bedb9c861bf29c7e205132eda9382b0bc2c5c4b45f919cf3a9f1cb74151f6d551f4480c82b2cb24cc5b028aa76eb7b4ab24171ab3cdadb8356f,它似乎并没有真正XOR它们 - 它只是给我的第一个字符串的值。我需要以某种方式逐字节执行吗?
  • 它似乎对我有用......让我在答案中添加一点。
【解决方案2】:

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

len(input1) > len(input2)

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

如果 len(input1) > len(input2):

          input1 = input1[:len(b)]

同样是一个 else 条件。

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 2015-11-06
    • 2011-08-09
    • 1970-01-01
    • 2019-09-13
    • 2015-10-30
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多