如何删除那些"\ x00\x00"

Luf*_*liu 10 python string byte

如何删除字符串中的"\ x00\x00"?我有很多这些字符串(如下所示).我可以使用re.sub来替换那些"\ x00".但我想知道是否有更好的方法可以做到这一点?在unicode,bytes和string之间进行转换总是令人困惑.

'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'.

gal*_*yan 18

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,问题是如何从字符串中删除模式,而不是像当前接受的答案那样从“字符串的结尾”或“字符串的结尾和开头”等中删除模式。 (2认同)

war*_*ia1 17

使用 rstrip

>>> text = 'Hello\x00\x00\x00\x00'
>>> text.rstrip('\x00')
'Hello'
Run Code Online (Sandbox Code Playgroud)

它会删除\x00字符串末尾的所有字符.


anr*_*gen 6

我认为更通用的解决方案是使用:

cleanstring = nullterminatedstring.split('\x00',1)[0]
Run Code Online (Sandbox Code Playgroud)

哪个split字符串将\x00用作分隔符1时间。在split(...)除一切空(它消除了分隔符)之后的空之前的一切:返回一个2元素的列表。追加[0]只返回第一个空 (\x00) 字符之前的字符串部分,我相信这就是您要查找的内容。

某些语言(特别是 C 类语言)的约定是单个空字符标记字符串的结尾。例如,您还应该期望看到如下所示的字符串:

'Hello\x00dpiecesofsomeoldstring\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

此处提供的答案将处理这种情况以及其他示例。

  • 很好的答案,对我帮助很大。顺便说一句,可能值得一提的是,在某些情况下,您需要按 b'\x00' 而不是 '\x00' 进行拆分(如果您实际上正在处理字节,在这种情况下可能会发生这种情况) (2认同)

sar*_*cii 5

基于提供的答案,我建议在清理数据包方面,strip() 比 rstrip() 更通用,因为 strip() 从提供的字符串的开头和结尾删除字符,而 rstrip() 只是删除字符从字符串的末尾。

但是,默认情况下,strip() 不会将 NUL 字符视为空格,因此您需要明确指定。这可能会让您措手不及,因为 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'
>>>
Run Code Online (Sandbox Code Playgroud)

这为您提供了所需的字符串/字节数组,每端都没有 NUL 字符,并且还保留了“数据包”中的任何 NUL 字符,这对于接收到的可能包含有效 NUL 字符的字节数据(例如 C-类型结构)。注意。在这种情况下,数据包必须“包装”,即由非 NUL 字符(前缀和后缀)包围,以允许正确检测,从而仅去除不需要的 NUL 字符。