【问题标题】:How to remove those "\x00\x00"如何删除那些“\x00\x00”
【发布时间】:2023-03-16 07:37:01
【问题描述】:

如何删除字符串中的“\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'.

【问题讨论】:

  • 除了从字符串中删除 \x00 之外,您可能还想首先考虑一下为什么要使用它们。也许构建字符串的代码可以处理它们?
  • 您编写的生成此字符串的代码可能是错误的。
  • @Neil,这是因为我是一个 C 包装器,我应该为字符串提供最大可能长度。对于那些较短的字符串,“\x00”会附加在末尾。
  • @LuffyCyliu,在 C 包装器中,考虑在将 char 数组转换为 Python 对象时包含数据的实际长度。数组上的strlen 将比 Python str.rstrip 或 str.replace 更快,并使 Python 界面更直观。也许docs.python.org/3.5/c-api/bytes.htmlPyBytes_FromStringAndSize() 会有所帮助。

标签: python string byte


【解决方案1】:

使用rstrip

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

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

【讨论】:

    【解决方案2】:
    >>> 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'
    

    【讨论】:

    • 这应该是接受的答案,问题是如何从字符串中删除模式,而不是像当前接受的答案那样从“字符串的结尾”或“字符串的结尾和开头”字符串”等
    【解决方案3】:

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

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

    这将split字符串使用\x00作为分隔符1时间。 split(...) 返回一个 2 元素列表:null 之前的所有内容以及 null 之后的所有内容(它删除了分隔符)。附加 [0] 仅返回第一个空 (\x00) 字符之前的字符串部分,我相信这就是您要查找的内容。

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

    'Hello\x00dpiecesofsomeoldstring\x00\x00\x00'
    

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

    【讨论】:

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

    基于提供的答案,我建议 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'
    >>>
    

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

    【讨论】:

      【解决方案5】:

      我尝试了striprstrip,但它们不起作用,但这个起作用了; 使用split 然后join 结果list

      if '\x00' in name:
          name=' '.join(name.split('\x00'))
      

      【讨论】:

        【解决方案6】:

        我在 Excel 中复制列表时遇到了这个问题。过程是:

        • 在 Excel 中复制发送给我的 ID 号列表
        • 运行一组 pyton 代码:
          • 将剪贴板作为文本读取
          • txt.Split('\n') 给出一个列表
          • 处理列表中的每个元素 (根据需要更新生产系统)

        问题是在读取剪贴板时,在文本末尾间歇性地返回多个 '\x00'。

        已经从使用win32clipboard改为使用pyperclip读取剪贴板,问题似乎解决了。

        【讨论】:

        • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-18
        • 2012-07-09
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        相关资源
        最近更新 更多