22

C の型フィールドを含むいくつかの構造体をアンパックしています。フィールドには、C コードで処理されるゼロが埋め込まれた UTF-8 文字列が含まれています (この関数の痕跡的な動作に注意してください)。バイトをデコードすると、最後に多くの文字が含まれるユニコード文字列が得られます。's'strncpyNUL

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

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

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

4

3 に答える 3

25

str.rstrip()末尾の NUL を削除するために使用します。

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
于 2011-02-22T04:43:34.433 に答える
24

rstripまたはは、文字列がヌルreplaceでバッファの最後までパディングされている場合にのみ機能します。実際には、バッファは最初から null に初期化されていない可能性があるため、b'hiya\0x\0'.

Cコードがnullの初期化されたバッファで始まり、決して再利用しないことを100%明確に知っている場合は、rstripより単純であることがわかるかもしれません。

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

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

于 2011-02-22T09:02:52.257 に答える
3

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

data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
  return data
return data[:i]
于 2013-01-19T21:36:15.873 に答える