所以我试图通过使用以下方法将字符串转换为二进制,然后xor二进制
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'
我看不出这里有什么问题。
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'
,这显然不是(单个)有效的base-2整数。
您的问题不清楚,因为您没有显示您在错误发生时使用的两个函数的定义 - 因此这个答案是猜测。
您可以将整数的二进制字符串表示形式转换为Python int
(内部存储为二进制值),只需将其传递给int()
函数 - 就像您在xor_bin()
函数中所做的那样。一旦你有两个int
值,你可以通过简单地使用^
运算符将它们“二进制”xor - 你似乎也知道了。
这意味着对两个整数的二进制字符串表示进行xor并将结果转换回二进制字符串表示可以像这样完成你的一个函数。这就是我的意思:
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