将字符串转换为二进制然后异或二进制

时间:2019-03-06 23:58:23

标签: python python-2.7

因此,我尝试使用以下方法将字符串转换为二进制,然后对二进制进行异或运算

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'

我看不到这里有什么问题。

2 个答案:

答案 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