私は npacking を含むいくつかの構造体 's'
Cのフィールドを入力します。フィールドには、Cコードで strncpy
によって処理されるゼロが埋め込まれたUTF-8文字列が含まれます(この関数の痕跡的な動作に注意してください)。バイトをデコードすると、最後にNUL
文字がたくさんあるUnicode文字列が表示されます。
>>> b'hiya\0\0\0'.decode('utf8')
'hiya\x00\x00\x00'
末尾のゼロバイトはUTF-8の一部であり、自動的に削除されるという印象を受けました。
ゼロバイトを削除する適切な方法は何ですか?
rstrip
またはreplace
は、文字列がバッファの最後にnullで埋め込まれている場合にのみ機能します。実際には、バッファが最初からnullに初期化されていない可能性があるため、b'hiya\0x\0'
のようなものが得られる可能性があります。
Cコードがnullで初期化されたバッファーで始まり、それを再利用しないことが100%わかっている場合は、rstrip
の方が簡単であることがわかるかもしれません。そうでない場合は、少し面倒ですが、はるかに安全です。 :
>>> b'hiya\0x\0'.split(b'\0',1)[0]
b'hiya'
これは最初のヌルをターミネータとして扱います。
str.rstrip()
を使用して、末尾のNULを削除します。
>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
分割/パーティションソリューションとは異なり、これは複数の文字列をコピーせず、長いバイト配列の場合は高速になる可能性があります。
data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
return data
return data[:i]
おそらく、.replace('\0', '')
を呼び出して、それらをクリーンアップできますか?