Как превратить двоичную строку в байт? - PullRequest
0 голосов
/ 22 ноября 2018

Если я возьму букву 'а' и закодирую ее в UTF-8, я получу следующий результат:

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

Теперь из байта я хотел бы преобразовать 'а' в двоичную строку ипревратить его обратно в «а».Для этого я выполняю следующий код:

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

Я получаю 0b11000011 и 0b10100000, что составляет 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 голосов
/ 22 ноября 2018

вам нужно, чтобы ваши вторые биты были 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"))
0 голосов
/ 22 ноября 2018

Преобразование значения base-2 обратно в целое число с int(s,2), преобразование этого целого числа в число байтов (int.to_bytes), основанное на исходной длине, деленной на 8, и преобразование с прямым порядком байтов для сохранения байтов вв правильном порядке, тогда .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()
'à'
0 голосов
/ 22 ноября 2018
>>> bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8)).decode('utf-8')
'à'

Есть несколько частей к этому.Конструктор bytes создает байтовую строку из последовательности целых чисел.Целые числа формируются из строк, используя int с основанием 2. range в сочетании с нарезкой отслаивает 8 символов за раз.Наконец decode преобразует эти байты обратно в символы Юникода.

...