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)
war*_*ia1 17
使用 rstrip
>>> text = 'Hello\x00\x00\x00\x00'
>>> text.rstrip('\x00')
'Hello'
Run Code Online (Sandbox Code Playgroud)
它会删除\x00字符串末尾的所有字符.
我认为更通用的解决方案是使用:
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)
此处提供的答案将处理这种情况以及其他示例。
基于提供的答案,我建议在清理数据包方面,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 字符。
| 归档时间: |
|
| 查看次数: |
29471 次 |
| 最近记录: |