如何在Python中从十六进制字符串中删除'\x'?

4

我正在使用Python中的wave模块读取一个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文件。有更好的想法吗?
怎么了?
4个回答

5
您想要做的一种方法是:

一种方法是:

>>> 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 是四个字符的十六进制表示(实际上,s 的长度为 4 而不是 24)。


5

确实,您的字符串中没有反斜杠。这就是为什么您无法删除它们的原因。

如果您尝试从该字符串中使用ord()len()函数玩弄每个十六进制字符,则可以看到它们的实际值。此外,您的字符串长度只有4,而不是16。

您可以尝试多种解决方案来实现您的结果: 使用“hex”编码:

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

或者使用 repr() 函数:

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

它有任何反向方式吗?我的意思是如何再次将 'ff1f00e8' 转换为 '\xff\x1f\x00\xe8'?是否有任何解码函数? - Ebrahim Ghasemi
3
反转后的代码为:'è\x00ñ'。关于长度 - 我在初始字符串中尝试使用反斜杠。 - Dmitry

3
使用encode方法:
>>> s = '\xff\x1f\x00\xe8'
>>> print s.encode("hex")
'ff1f00e8'

0

由于这是十六进制表示,因此请使用hex进行编码

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接