【问题标题】:How to XOR two strings that contain hex numbers in python?如何在python中对两个包含十六进制数字的字符串进行异或?
【发布时间】:2013-06-27 14:27:08
【问题描述】:

我已经在网上寻找答案,但他们似乎都没有以我的方式解决我的问题(我知道,我很挑剔:D)。

这里是交易:我使用字符串类型来存储两个十六进制数字,因为 python 中的默认整数类型对于我的目的来说不够长。比如这样:

S1 = "315c4eeaa8b5f8aaf9174145bf43e1784b8fa00dc71d885a804e5ee9fa40b16349c146fb778cdf2d3aff021dfff5b403b510d0d0455468aeb98622b137dae857553ccd8883a7bc37520e06e515d22c954eba5025b8cc57ee59418ce7dc6bc41556bdb36bbca3e8774301fbcaa3b83b220809560987815f65286764703de0f3d524400a19b159610b11ef3e"
S2 = "234c02ecbbfbafa3ed18510abd11fa724fcda2018a1a8342cf064bbde548b12b07df44ba7191d9606ef4081ffde5ad46a5069d9f7f543bedb9c861bf29c7e205132eda9382b0bc2c5c4b45f919cf3a9f1cb74151f6d551f4480c82b2cb24cc5b028aa76eb7b4ab24171ab3cdadb8356f"

关键是,这些应该是数字,但它们存储在一个字符串中。我想要做的是将这两个字符串视为数字,对两者执行按位异或,然后以类似的形式获得输出 - 存储在字符串中的十六进制数字。

我对编程比较陌生,甚至对 python 也比较陌生,所以我想不出一种方法来做到这一点。我不只是在寻找一个脚本,我还想了解它是如何工作的,所以请仔细解释一下,因为我是个菜鸟 :D。

【问题讨论】:

  • 您不必担心整数大小。 Python 足够聪明,可以在必要时使用其大整数实现 (long)。
  • 在第一次尝试对整数进行异或运算后,您是否得出了 Python 无法处理大整数的结论?还是你只是假设?
  • 调用binascii.unhexlify() 并应用http://stackoverflow.com/questions/2119761/simple-python-challenge-fastest-bitwise-xor-on-data-buffers 的任何解决方案,调用binascii.hexlify() 以获取十六进制字符串。
  • 我通过从 Internet 上阅读得出的结论 :D,有人遇到了类似的问题,他的东西不起作用,因为显然 python 在将其转换为整数类型时截断了他的数字,如该值太大而无法容纳。所以我盲目地相信了这一点,并没有费心去尝试:D。
  • 您的字符串实际上占用的内存几乎是等效的 int/long 的两倍,python 允许 int/long 类型增长到最大可用内存。

标签: python string hex xor


【解决方案1】:

Python 可以将你的值保存为数字。

见此证明,

>>> hex(int(S1, 16))[2:-1] == S1
True

我只是在调整字符串,从开头删除'0x',从末尾删除L

对于你的答案,你需要做的就是,

hex(int(S1, 16) ^ int(S2, 16))

【讨论】:

  • because the default integer type in python is not long enough for my purposes ?
  • int 太小了,但构造函数其实很聪明:type(int(S1, 16)) ... <type 'long'>
【解决方案2】:
  1. 将两个字符串反转为 s1_r 和 s2_r
  2. 通过 char xor (char1 (from s1_r) xor char2 (from s2_r)) 做一个 char
  3. 将结果附加到 xor_str
  4. 反转 xor_str

【讨论】:

  • long 类型实际上是立即支持异或的,并且它具有任意整数大小,因此无需在 Python 中手动执行此操作。
【解决方案3】:

要执行 XOR 运算,假设它们是长整数,您可以在 Python 中使用 long 类型:

# Convert the hex string S1 and S2 to longs
l1=long(S1,16) 
l2=long(S2,16)
result=hex(l1 ^ l2) # Convert the XOR of the strings
# Output will be:
# '0x1013abb8b0ead34450ee04e8d507fa16552e5aa9f2cc9551acc9d71b646f8a9b4f3548f2068172b201bf0daf75bdddd0dedd861b9ccbcf7c9ce53e39ecafa9c86880fba0c600778fc7bc6e3bd60c8b0df469f5a7f1da4339f9202bdb43b97b22db69642ce5402b8ce44f86d990dbf5a2L'

【讨论】:

  • l1 = int(s1, 16) 也可以正常工作! Python 处理它,您不必担心它的大小! type(int(S1, 16)) -> <type 'long'>
  • 是的,这正是我在评论中写的:)
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 2023-04-08
  • 2012-06-05
  • 2014-01-01
  • 2017-05-21
  • 2014-10-07
  • 2019-12-26
  • 2019-07-26
相关资源
最近更新 更多