Преобразование нулевых байтов в строку 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', '')
и очистить их?