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

Python:字符串中的XOR十六进制值,python,string,xor,Python,String,Xor,我是python新手,我(也许)有一个愚蠢的问题 我必须对两个值进行异或运算。当前我的值如下所示: v1= 这将不起作用,因为它返回每个字符的ASCII值(然后对它们进行异或运算),这显然与实际的十六进制值不同。您的错误是将字符转换为ASCII码点,而不是整数值 您可以使用和来转换它们: int(string,16)将输入字符串解释为十六进制值格式(整数,'x')输出给定整数的十六进制字符串 无需使用zip()即可完成此操作,只需将整个字符串作为一个大整数: return '{1:0{0}x}'

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

我必须对两个值进行异或运算。当前我的值如下所示:

v1=


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

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

您可以使用和来转换它们:

int(string,16)
将输入字符串解释为十六进制值<代码>格式(整数,'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

将十六进制转换为整数,对整数进行异或运算。这会在开始时生成一个
0x
,并且实际上会在前导
0
字符丢失时生成一个较短的十六进制值。很好,我喜欢您更好地使用format()函数
return ''.join(format(int(a, 16) ^ int(b, 16), 'x') for a,b in zip(s1,s2))
return '{1:0{0}x}'.format(len(s1), int(s1, 16) ^ int(s2, 16))
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) 
_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