python中十六进制数的按位异或

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)

你好像忽略了这些方便的事实,至少:

  • Python本机支持带有0x前缀的十六进制整数文字.
  • "十六进制"只是一个演示细节; 算术以二进制方式完成,然后将结果打印为十六进制.
  • 输入的格式(十六进制文字)和输出之间没有联系,Python变量中没有"十六进制数"这样的东西.
  • 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)

  • 当然如果@pratibha只有字符串文字,那么另一种选择是`hex(int('12ef',16)^ int('abcd',16))` (5认同)

小智 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)])


den*_*nov 5

这是一个更好的功能

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)

  • 看起来像来自Coursera上Crypto 1课程中一项作业的确切代码。;) (10认同)

GT.*_*GT. 5

如果字符串长度相同,那么我会选择'%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)]