因此,我尝试使用以下方法将字符串转换为二进制,然后对二进制进行异或运算
def string_to_binary(s):
return ' '.join(map(bin,bytearray(s,encoding='utf-8')))
def xor_bin(a,b):
return int(a,2) ^ int(b,2)
当我尝试运行xor_bin
函数时,出现以下错误:
Exception has occurred: exceptions.ValueError
invalid literal for int() with base 2: '0b1100010 0b1111001 0b1100101 0b1100101 0b1100101'
我看不到这里有什么问题。
答案 0 :(得分:2)
bin
在这里很糟糕;它不会填充到八位数字(因此,高位是0
时,您将丢失数据对齐,并将该损失左侧的所有位误解为幅度要小一些),并且添加不需要的0b
前缀。 str.format
可以通过零填充并省略0b
前缀来解决这两个问题(我还删除了连接符字符串中的空格,因为您不希望在结果中留空格):
def string_to_binary(s):
return ''.join(map('{:08b}'.format, bytearray(s, encoding='utf-8')))
有了这个,string_to_binary('byeee')
就可以得到您想要的'0110001001111001011001010110010101100101'
,而'0b1100010 0b1111001 0b1100101 0b1100101 0b1100101'
显然不是一个有效的以2为底的整数。
答案 1 :(得分:0)
您的问题尚不清楚,因为您没有显示错误发生时在何处使用了定义的两个函数-因此,此答案为猜测。
您只需将其传递给int
函数即可将整数的二进制字符串表示形式转换为Python int()
(内部存储为二进制值),就像您所做的那样在xor_bin()
函数中。一旦有了两个int
值,您就可以使用^
运算符对它们进行“二进制”运算,这似乎又是您知道的。
这意味着将两个整数的二进制字符串表示形式进行异或,然后将结果转换回二进制字符串表示形式,这可以像您一样执行您的函数之一。这就是我的意思:
def xor_bin(a, b):
return int(a, 2) ^ int(b, 2)
s1 = '0b11000101111001110010111001011100101'
s2 = '0b00000000000000000000000000001111111'
# ---------------------------------------
# '0b11000101111001110010111001010011010' expected result of xoring them
result = xor_bin(s1, s2)
print bin(result) # -> 0b11000101111001110010111001010011010