Преобразование нулевых байтов в строку UTF-8
Я распаковка несколько структур, которые содержат 's'
поля типа из C. поля содержат строки UTF-8 с нулевым заполнением, обрабатываемые strncpy
в коде C (обратите внимание на рудиментарное поведение этой функции). Если я декодирую байты, я получаю строку unicode с большим количеством NUL
символы на конце.
>>> b'hiya'.decode('utf8')
'hiyax00x00x00'
у меня создалось впечатление, что конечные нулевые байты являются частью UTF-8 и будут удалены автоматически.
Как правильно отбросить нулевые байты?
4 ответов
или rstrip
или replace
будет работать только в том случае, если строка заполняется до конца буфера с нулями. На практике буфер, возможно, не был инициализирован до null для начала, поэтому вы можете получить что-то вроде b'hiyax'
.
если вы знаете категорически 100%, что код C начинается с нулевого инициализированного буфера и никогда не использует его повторно, то вы можете найти rstrip
чтобы быть проще, иначе я бы пошел на немного более грязный, но много безопаснее:
>>> b'hiyax'.split(b'',1)[0]
b'hiya'
который рассматривает первый null как Терминатор.
использовать str.rstrip()
чтобы удалить конечные нули:
>>> 'hiya'.rstrip('')
'hiya'
В отличие от решения split/partition это не копирует несколько строк и может быть быстрее для длинных bytearrays.
data = b'hiya'
i = data.find(b'\x00')
if i == -1:
return data
return data[:i]