如何在Python中对两个字符串进行异或操作

9

你好,我正在尝试在Python中对两个字符串进行异或操作(应先转换为十六进制)。我知道一种方法可以实现:

def xor_two_str(str1, str2):
    return hex(int(str1,16) ^ int(str2,16))

但是我尝试过类似这样的东西:
def change_to_be_hex(str):
    return hex(int(str,base=16))
def xor_two_str(str1,str2):
    a = change_to_be_hex(str1)
    b = change_to_be_hex(str2)
    return hex(a ^ b)
print xor_two_str("12ef","abcd")

这将返回TypeError: ^ 不应该在str和str之间使用。我不知道为什么。
同时,这个函数也不起作用:
bcd = change_to_be_hex("12ef")
def increment_hex(hex_n):
   return hex_n + 1
result = increment_hex(bcd)
print result

错误信息为:TypeError: 无法将“str”对象和“int”对象连接起来。我觉得这很奇怪 :(
谢谢!

1
@n1c9 的意思是字节异或运算符,而不是幂运算符。 - xvan
@n1c9 嗯...是的,它是。 - jDo
我改正了! - n1c9
因此,您知道如何对表示为十六进制字符串的数字执行异或操作,并且知道无法在字符串上使用 ^。那么你的问题是什么? - Stop harming Monica
OP,你不想将string1中每个字符的数值与string2中相同位置的字符的值进行异或运算吗?(如果它们的长度不同,则对长度取模以实现循环)。为什么要费心进行十六进制转换呢? - jDo
显示剩余2条评论
3个回答

12

你好, 下面的函数返回hex() 的结果,它返回一个字符串

def change_to_be_hex(s):
    return hex(int(s,base=16))

你应该在整数上使用^运算符。

def change_to_be_hex(s):
    return int(s,base=16)
    
def xor_two_str(str1,str2):
    a = change_to_be_hex(str1)
    b = change_to_be_hex(str2)
    return hex(a ^ b)
print xor_two_str("12ef","abcd")

我不确定那是否是你想要的结果。如果你想对两个字符串进行异或运算,那就意味着你想要将一个字符串的每个字符与另一个字符串的字符进行异或运算。然后,你应该将每个字符或str1的ord()值与str2中每个字符的ord()值进行异或运算。

def xor_two_str(a,b):
    xored = []
    for i in range(max(len(a), len(b))):
        xored_value = ord(a[i%len(a)]) ^ ord(b[i%len(b)])
        xored.append(hex(xored_value)[2:])
    return ''.join(xored)
    
print xor_two_str("12ef","abcd")

或者在一行中:

def xor_two_str(a,b):
    return ''.join([hex(ord(a[i%len(a)]) ^ ord(b[i%(len(b))]))[2:] for i in range(max(len(a), len(b)))])

print xor_two_str("12ef","abcd")

2

hex 返回一个字符串,所以你正在尝试对两个字符串进行异或操作。

def change_to_be_hex(s):
   return int(s,base=16)

应该修复这个问题。

1

当你最初返回十六进制值时,例如在change_to_be_hex中,你需要显式地将其转换为int。你需要在整个代码中这样做来添加一些内容 - 因此,将increment_hex更改为:

return (int(hex_n) + 1)

2
^ 被认为是按位异或操作。 - pixis
1
你试过 4 ^ 5 吗?你知道吗?没有错误。不仅 ^ 被识别了,它还做了与 OP 想要的相似的事情。 - zondo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接