Преобразование нулевых байтов в строку UTF-8

Я распаковываю несколько структур, которые содержат 's' поля типа C. С полями с нулевым заполнением строк UTF-8, обработанных strncpy в коде C (обратите внимание на эту функцию рудиментарного поведения). Если я декодирую байты, я получаю строку юникода с большим количеством символов NUL в конце.

>>> b'hiya\0\0\0'.decode('utf8')
'hiya\x00\x00\x00'

У меня создалось впечатление, что конечные нулевые байты являются частью UTF-8 и будут автоматически удалены.

Какой правильный способ сбросить нулевые байты?

Ответы

Ответ 1

Либо rstrip, либо replace будет работать, только если строка будет заполнена до конца буфера с нулями. На практике буфер, возможно, не был инициализирован нулем, чтобы начать, чтобы вы могли получить что-то вроде b'hiya\0x\0'.

Если вы знаете категорически 100%, что код C начинается с нулевого инициализированного буфера и никогда больше не использует его повторно, то вы можете найти rstrip более простым, иначе я бы стал немного более грязным, но гораздо безопаснее

>>> b'hiya\0x\0'.split(b'\0',1)[0]
b'hiya'

который обрабатывает первый нуль как терминатор.

Ответ 2

Используйте str.rstrip(), чтобы удалить конечные NUL:

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'

Ответ 3

В отличие от split/partition-solution, это не копирует несколько строк и может быть быстрее для длинных байтов.

data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
  return data
return data[:i]

Ответ 4

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