web-dev-qa-db-ja.com

それらの「\ x00 \ x00」を削除する方法

文字列内の「\ x00\x00」を削除するにはどうすればよいですか?私はそれらの文字列の多くを持っています(以下に示す例)。 re.subを使用して、これらの "\ x00"を置き換えることができます。しかし、私はそれを行うより良い方法があるかどうか疑問に思っていますか? Unicode、バイト、文字列間の変換は常に混乱を招きます。

'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.

15
Luffy Cyliu

rstripを使用

>>> text = 'Hello\x00\x00\x00\x00'
>>> text.rstrip('\x00')
'Hello'

文字列の末尾にあるすべての\x00文字を削除します。

23
warownia1
>>> a = 'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> a.replace('\x00','')
'Hello'
18
galaxyan

提供された回答に基づいて、データパケットをクリーンアップする場合、strip()はrstrip()よりも汎用的であることをお勧めします。文字列の最後から。

ただし、NUL文字は、strip()ではデフォルトで空白として扱われないため、明示的に指定する必要があります。 print()はもちろんNUL文字を表示しないので、これはあなたを捕まえることができます。私が使用した私の解決策は、「.strip().strip('\x00')」を使用して文字列をクリーンアップすることでした:

>>> arbBytesFromSocket = b'\x00\x00\x00\x00hello\x00\x00\x00\x00'
>>> arbBytesAsString = arbBytesFromSocket.decode('ascii')
>>> print(arbBytesAsString)
hello
>>> str(arbBytesAsString)
'\x00\x00\x00\x00hello\x00\x00\x00\x00'
>>> arbBytesAsString = arbBytesFromSocket.decode('ascii').strip().strip('\x00')
>>> str(arbBytesAsString)
'hello'
>>>

これにより、両端にNUL文字がない、必要な文字列/バイト配列が得られ、「データパケット」内のNUL文字も保持されます。これは、有効なNUL文字を含む可能性のある受信バイトデータ(たとえば、C-タイプ構造)。

3
sarlacii

より一般的な解決策は次のようにすることだと思います:

_cleanstring = nullterminatedstring.split('\x00',1)[0]
_

_\x00_を区切り文字として_1_時間を使用して文字列をsplitします。 split(...)は、2つの要素のリストを返します。nullの後のすべてに加えて、nullの前のすべて(デリミタを削除します)。 _[0]_を追加すると、最初のnull(\ x00)文字の前の文字列の部分のみが返されます。

一部の言語、特にC言語のような言語では、1つのヌル文字がストリングの終わりを示します。たとえば、次のような文字列も期待できます。

_'Hello\x00dpiecesofsomeoldstring\x00\x00\x00'
_

ここで提供する答えは、その状況と他の例を処理します。

3
anregen