Python: XOR 字符串中的十六进制值
Python: XOR hex values in strings
我是 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 值(然后对它们进行异或),这显然与实际的十六进制值不同。
您的错误是将字符转换为它们的 ASCII 代码点,而不是整数值。
您可以使用 int()
and 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()
将结果整数格式化为正确的零填充十六进制长度。
将字符串解析为整数,然后对整数进行异或运算:
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
我是 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 值(然后对它们进行异或),这显然与实际的十六进制值不同。
您的错误是将字符转换为它们的 ASCII 代码点,而不是整数值。
您可以使用 int()
and 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()
将结果整数格式化为正确的零填充十六进制长度。
将字符串解析为整数,然后对整数进行异或运算:
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