我正在解压几个包含C 中's'
类型字段的结构。这些字段包含由strncpy
C 代码处理的零填充 UTF-8 字符串(请注意此函数的残留行为)。如果我解码字节,我会得到一个结尾有很多NUL
字符的 unicode 字符串。
>>> b'hiya\0\0\0'.decode('utf8')
'hiya\x00\x00\x00'
我的印象是尾随零字节是 UTF-8 的一部分,并且会自动删除。
删除零字节的正确方法是什么?
用于str.rstrip()
删除尾随的 NUL:
>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
要么 要么rstrip
仅replace
在字符串以空值填充到缓冲区末尾时才有效。在实践中,缓冲区可能尚未初始化为 null,因此您可能会得到类似b'hiya\0x\0'
.
如果您明确 100% 知道 C 代码以 null 初始化缓冲区开始并且从不重复使用它,那么您可能会发现rstrip
它更简单,否则我会选择稍微混乱但更安全的代码:
>>> b'hiya\0x\0'.split(b'\0',1)[0]
b'hiya'
它将第一个 null 视为终止符。
与拆分/分区解决方案不同,它不会复制多个字符串,并且对于长字节数组可能更快。
data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
return data
return data[:i]