【问题标题】:Python: XOR hex values in stringsPython:字符串中的 XOR 十六进制值
【发布时间】:2017-10-09 12:18:56
【问题描述】:

我是 python 新手,我有一个(也许)一个愚蠢的问题。

我必须异或两个值。目前我的价值观是这样的:

v1 =

<class 'str'>
2dbdd2157b5a10ba61838a462fc7754f7cb712d6

v2 =

<class 'str'>
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

但问题是,我需要对实际的 HEX 值进行异或运算,而不是字符串中给定字符的 ascii 值。

例如:

第一个字符串的第一个字节是s1 = 2d,第二个字符串是s2 = 5b

def sxor(s1,s2):
    return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))

这不起作用,因为它返回每个字符的 ASCII 值(然后对它们进行异或),这显然与实际的十六进制值不同。

【问题讨论】:

  • 将十六进制转换为整数,异或整数。

标签: python string xor


【解决方案1】:

您的错误是将字符转换为它们的 ASCII 代码点,而不是整数值。

您可以改用int()format() 转换它们:

return ''.join(format(int(a, 16) ^ int(b, 16), 'x') for a,b in zip(s1,s2))

int(string, 16) 将输入字符串解释为十六进制值。 format(integer, 'x') 为给定整数输出一个十六进制字符串。

不用zip() 也可以做到这一点,只需将整个字符串作为一个大整数:

return '{1:0{0}x}'.format(len(s1), int(s1, 16) ^ int(s2, 16))

为确保前导 0 字符不会丢失,上面使用 str.format() 将结果整数格式化为正确长度的零填充十六进制。

【讨论】:

    【解决方案2】:

    将字符串解析为整数然后异或整数:

    def sxor(s1,s2):
        i1 = int(s1, 16)
        i2 = int(s2, 16)
        # do you want the result as an int or as another string?
        return hex(i1 ^ i2) 
    

    【讨论】:

    • 这会在开始时生成一个0x,实际上可以生成一个较短的十六进制值,因为前导0 字符会丢失。
    • 好点,我喜欢你更好地使用 format() 函数
    【解决方案3】:

    适用于 python3:

    _HAS_NUMPY = False
    try:
        import numpy
        _HAS_NUMPY = True
    except:
        pass
    
    def my_xor(s1, s2):
        if _HAS_NUMPY:
            b1 = numpy.fromstring(s1, dtype="uint8")
            b2 = numpy.fromstring(s2, dtype="uint8")
            return (b1 ^ b2).tostring()
    
        result = bytearray(s1)
        for i, b in enumerate(s2):
            result[i] ^= b
        return result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-14
      • 2016-10-05
      • 2019-07-27
      • 2016-04-22
      • 1970-01-01
      • 2020-06-20
      • 2023-04-08
      • 2017-01-02
      相关资源
      最近更新 更多