Преобразовать заполненные нулями байты в строку UTF-8 - PullRequest
18 голосов
/ 22 февраля 2011

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

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

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

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

Ответы [ 4 ]

20 голосов
/ 22 февраля 2011

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

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
18 голосов
/ 22 февраля 2011

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

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

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

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

3 голосов
/ 20 января 2013

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

data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
  return data
return data[:i]
1 голос
/ 22 февраля 2011

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

...