【问题标题】:How to remove '\x' from a hex string in Python?如何从 Python 中的十六进制字符串中删除 '\x'?
【发布时间】:2015-11-14 11:34:04
【问题描述】:

我正在使用wave 模块在Python 中读取wav 音频文件。此库中的 readframe() 函数将帧返回为十六进制字符串。我想删除此字符串的\x,但translate() 函数无法按我的意愿工作:

>>> input = wave.open(r"G:\Workspace\wav\1.wav",'r')
>>> input.readframes (1)
'\xff\x1f\x00\xe8'
>>> '\xff\x1f\x00\xe8'.translate(None,'\\x')
'\xff\x1f\x00\xe8'
>>> '\xff\x1f\x00\xe8'.translate(None,'\x')
ValueError: invalid \x escape
>>> '\xff\x1f\x00\xe8'.translate(None,r'\x')
'\xff\x1f\x00\xe8'
>>> 

我想以任何方式将结果值除以 2,然后再次添加 \x 并生成一个包含这些新值的新 wav 文件。谁有更好的主意?

怎么了?

【问题讨论】:

    标签: python string python-2.7 python-3.x wave


    【解决方案1】:

    确实,您的字符串中没有反斜杠。所以,这就是你不能删除它们的原因。

    如果您尝试使用此字符串中的每个十六进制字符(使用 ord()len() 函数 - 您将看到它们的真实值。此外,您的字符串的长度只是 4,而不是 16。

    您可以使用多种解决方案来实现您的结果: “十六进制”编码:

    '\xff\x1f\x00\xe8'.encode('hex')
    'ff1f00e8'
    

    或者使用repr()函数:

    repr('\xff\x1f\x00\xe8').translate(None,r'\\x')
    

    【讨论】:

    • 它有什么相反的方法吗?我的意思是如何再次将 'ff1f00e8' 转换为 '\xff\x1f\x00\xe8' ?任何解码功能?
    • Reverse: 'ff1f00e8'.decode('hex') :) 长度呢 - 在初始字符串中使用反斜杠。
    【解决方案2】:

    做你想做的事情的一种方法是:

    >>> s = '\xff\x1f\x00\xe8'
    >>> ''.join('%02x' % ord(c) for c in s)
    'ff1f00e8'
    

    translate 不起作用的原因是您看到的不是字符串本身,而是它的表示。也就是说,\x 不包含在字符串中:

    >>> '\\x' in '\xff\x1f\x00\xe8'
    False
    

    \xff\x1f\x00\xe8 是 for 字符的十六进制表示(实际上是 len(s) == 4,而不是 24)。

    【讨论】:

      【解决方案3】:

      使用编码方式:

      >>> s = '\xff\x1f\x00\xe8'
      >>> print s.encode("hex")
      'ff1f00e8'
      

      【讨论】:

        【解决方案4】:

        由于这是十六进制表示,encode 使用 hex

        >>> '\xff\x1f\x00\xe8'.encode('hex')
        'ff1f00e8'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-09
          • 2016-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-19
          • 2021-08-12
          相关资源
          最近更新 更多