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

问题描述 投票:1回答:2

所以我试图通过使用以下方法将字符串转换为二进制,然后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'

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

python python-2.7
2个回答
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',这显然不是(单个)有效的base-2整数。


0
投票

您的问题不清楚,因为您没有显示您在错误发生时使用的两个函数的定义 - 因此这个答案是猜测。

您可以将整数的二进制字符串表示形式转换为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
© www.soinside.com 2019 - 2024. All rights reserved.