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

2024-03-28 20:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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文件。有人有更好的主意吗?

怎么了?


Tags: 模块函数字符串noneinputopenwave音频文件
3条回答

使用编码方法:

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

一种方法是:

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

事实上,你的绳子上没有反睫毛。所以,这就是为什么你不能移除它们。

如果您尝试使用这个字符串中的每个十六进制字符(使用ord()len()函数),您将看到它们的实际值。另外,你的绳子长度只有4,不是16。

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

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

或者使用repr()函数:

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

相关问题 更多 >