web-dev-qa-db-ja.com

ゼロが埋め込まれたバイトをUTF-8文字列に変換します

私は npacking を含むいくつかの構造体 's' Cのフィールドを入力します。フィールドには、Cコードで strncpy によって処理されるゼロが埋め込まれたUTF-8文字列が含まれます(この関数の痕跡的な動作に注意してください)。バイトをデコードすると、最後にNUL文字がたくさんあるUnicode文字列が表示されます。

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

末尾のゼロバイトはUTF-8の一部であり、自動的に削除されるという印象を受けました。

ゼロバイトを削除する適切な方法は何ですか?

21
Matt Joiner

rstripまたはreplaceは、文字列がバッファの最後にnullで埋め込まれている場合にのみ機能します。実際には、バッファが最初からnullに初期化されていない可能性があるため、b'hiya\0x\0'のようなものが得られる可能性があります。

Cコードがnullで初期化されたバッファーで始まり、それを再利用しないことが100%わかっている場合は、rstripの方が簡単であることがわかるかもしれません。そうでない場合は、少し面倒ですが、はるかに安全です。 :

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

これは最初のヌルをターミネータとして扱います。

20
Duncan

str.rstrip() を使用して、末尾のNULを削除します。

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
22
Adam Rosenfield

分割/パーティションソリューションとは異なり、これは複数の文字列をコピーせず、長いバイト配列の場合は高速になる可能性があります。

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

おそらく、.replace('\0', '')を呼び出して、それらをクリーンアップできますか?

1
Paul Schreiber