Преобразование нулевых байтов в строку 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]

возможно, вы могли бы назвать .replace('', '') и очистить их?