我是 python 新手,我(也许)有一个愚蠢的问题。
我必须对两个值进行异或。目前我的值(value)观是这样的:
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 值(然后对它们进行异或),这显然与实际的十六进制值不同。
最佳答案
您的错误是将字符转换为其 ASCII 代码点,而不是整数值。
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()
将结果整数格式化为正确长度的零填充十六进制。
关于Python:字符串中的异或十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646292/