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