如何将二进制字符串转换为字节?

时间:2018-11-21 23:44:54

标签: python unicode utf-8 utf

如果我将字母'à'并以UTF-8编码,则会得到以下结果:

'à'.encode('utf-8')
>> b'\xc3\xa0'

现在从字节数组中,我想将“à”转换为二进制字符串,然后将其转换回“à”。为此,我执行以下代码:

byte = bytearray('à','utf-8')
for x in byte:
    print(bin(x))

我得到0b110000110b10100000,分别是195和160。然后,我将它们融合在一起,取出0b部分。现在,我执行以下代码:

s = '1100001110100000'
value1 =  s[0:8].encode('utf-8')
value2 =  s[9:16].encode('utf-8')
value = value1 + value2
print(chr(int(value, 2)))
>> 憠

无论我如何开发后半部分,我都会得到符号,并且似乎永远无法找回我的'à'。我想知道为什么吗?以及如何获得“à”。

3 个答案:

答案 0 :(得分:3)

>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'

这有多个部分。 bytes构造函数根据整数序列创建字节字符串。整数由使用int(基数为2)的字符串组成。range与切片一起一次剥离了8个字符。最后decode将这些字节转换回Unicode字符。

答案 1 :(得分:0)

您需要第二位为s[8:16](或仅为s[8:]),否则您将获得0100000

您还需要先将“位字符串”转换为整数,然后再使用int("0010101",2)将其视为一个字节

s = '1100001110100000'
value1 =  bytearray([int(s[:8],2), # bits 0..7 (8 total)
                     int(s[8:],2)] # bits 8..15 (8 total)
) 
print(value1.decode("utf8"))

答案 2 :(得分:0)

使用int(s,2)将base-2值转换回整数,根据原始长度除以8并使用big-endian转换将该整数转换为字节数(int.to_bytes)以保持按正确的顺序排列字节,然后.decode()(在Python 3中默认为utf8

>>> s = '1100001110100000'
>>> int(s,2)
50080
>>> int(s,2).to_bytes(len(s)//8,'big')
b'\xc3\xa0'
>>> int(s,2).to_bytes(len(s)//8,'big').decode()
'à'