pra*_*bha 34 python hex bit-manipulation xor
我们如何在python中异或十六进制数字,例如.我想xor'ABCD'到'12EF'.答案应该是B922.
我使用下面的代码,但它返回垃圾值
def strxor(a, b): # xor two strings of different lengths
if len(a) > len(b):
return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
else:
return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])
key ='12ef'
m1='abcd'
print strxor(key,m1)
Run Code Online (Sandbox Code Playgroud)
unw*_*ind 99
哇.你真的太过于复杂了.尝试:
>>> print hex(0x12ef ^ 0xabcd)
0xb922
Run Code Online (Sandbox Code Playgroud)
你好像忽略了这些方便的事实,至少:
0x
前缀的十六进制整数文字.hex()
函数可用于将任何数字转换为十六进制字符串以供显示.如果您已将数字作为字符串,则可以使用该int()
函数转换为数字,方法是提供预期的基数(十六进制数为16):
>>> print int("12ef", 16)
4874
Run Code Online (Sandbox Code Playgroud)
因此,您可以执行两次转换,执行XOR,然后转换回十六进制:
>>> print hex(int("12ef", 16) ^ int("abcd", 16))
0xb922
Run Code Online (Sandbox Code Playgroud)
小智 10
如果两个十六进制字符串长度相同并且您想要一个十六进制字符串输出,那么您可以尝试这样做.
def hexxor(a, b): # xor two hex strings of the same length return "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a, b)])
这是一个更好的功能
def strxor(a, b): # xor two strings of different lengths
if len(a) > len(b):
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
else:
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])
Run Code Online (Sandbox Code Playgroud)
如果字符串长度相同,那么我会选择'%x' % ()
内置的xor(^
).
例子 -
>>>a = '290b6e3a'
>>>b = 'd6f491c5'
>>>'%x' % (int(a,16)^int(b,16))
'ffffffff'
>>>c = 'abcd'
>>>d = '12ef'
>>>'%x' % (int(a,16)^int(b,16))
'b922'
Run Code Online (Sandbox Code Playgroud)
如果字符串的长度不同,则使用切片将较长的字符串截断为较短的字符串 longer = longer[:len(shorter)]