将零填充字节转换为 UTF-8 字符串

问题描述 投票:0回答:4

我正在解包几个包含来自 C 的

's'
类型字段的结构。这些字段包含由 C 代码中的
strncpy
处理的零填充 UTF-8 字符串(请注意此函数的残留行为)。如果我解码字节,我会得到一个 unicode 字符串,末尾有很多
NUL
字符。

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

我的印象是尾随零字节是 UTF-8 的一部分,会自动删除。

删除零字节的正确方法是什么?

python unicode utf-8 byte strncpy
4个回答
26
投票
仅当字符串用空值填充到缓冲区末尾时,

rstrip
replace
才有效。实际上,缓冲区可能尚未初始化为 null,因此您可能会得到类似
b'hiya\0x\0'
的内容。

如果您明确 100% 知道 C 代码以空初始化缓冲区开始,并且永远不会重复使用它,那么您可能会发现

rstrip
更简单,否则我会选择稍微混乱但更安全的方式:

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

将第一个 null 视为终止符。


25
投票

使用

str.rstrip()
删除尾随的 NUL:

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

3
投票

与分割/分区解决方案不同,它不会复制多个字符串,并且对于长字节数组可能会更快。

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

0
投票

我发现这是一个巧妙的解决方案:

''.join(chr(b) if b else '' for b in b'\0hello\0\0)
© www.soinside.com 2019 - 2024. All rights reserved.