繁体   English   中英

Python:字符串中的XOR十六进制值

[英]Python: XOR hex values in strings

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

我要XOR两个值。 目前我的值看起来像这样:

v1 =

<class 'str'>
2dbdd2157b5a10ba61838a462fc7754f7cb712d6

v2 =

<class 'str'>
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

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

例如:

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

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

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

您的错误是将字符转换为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()将结果整数格式化为零填充十六进制的正确长度。

将字符串解析为int,然后解析为int:

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) 

适用于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM