2013-09-22 53 views
2

我正在尝试使用wave库从波形文件中读取二进制数据。数据被读取并报告为'\ x0f \ x06 \ x0a ...'形式的字符串文字,我想将十六进制数字转换为整数(您知道,以十为底)。我遇到的问题是这些字符串并不是真正被当作十六进制数字,而是有点像unicode字符。解压“0xff”与“ xff”

import wave 
import struct 

path="C:\\directory\\file.wav" 

file=wave.open(path,'r') 
data=file.readframes(10) 

print repr(data) 

'\ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00'

int_dat=struct.unpack('10i',data) 

,来了,当我尝试像

struct.unpack('i','\xff') 

是struct.unpack期待长度为4的字符串,并且只接收长度为1的字符串,显然,我的错误为什么会发生这种情况,但是有没有解压的格式选项可以让我解开'\ xff'?

struct.unpack('i','0xff') 

显然工作正常。同样

struct.unpack('i',r'\xff') 

的作品。

或者,是否有方便将字符串转换为'\ xff \ x01 \ x63 ...' 为原始字符串(尽管我不确定这是否合理,因为“\ x”被视为转义字符(这是正确的术语?)而不是字符),或者以'0xff0x010x63'的形式处理。

+0

欢迎来到SO和+1为写得好的问题。 –

+0

输入的确切形式是什么?它是否有前导和尾随单引号?如果您添加了“打印数据”的确切输出,这将有所帮助。 –

+0

如果您添加了'print repr(data)'的输出,也会有所帮助。看起来非常奇怪,一个波形文件将包含文本而不是原始的二进制数据。 –

回答

1

好的,从注释中可以明显看出,这是一个二进制文件,而不是文字字符串。没关系 - 我们预计 a .wav文件是二进制数据。

首先将open()模式更改为rb

然后,如果你读10个字节,你可以通过

struct.unpack('10b', data) 

,将返回的10个整数的元组解包。你几乎在那里;-)

0

ord()会将字符串元素转换为其对应的值。

>>> ord('\x0f') 
15 

或使用适当大小的struct转换。

>>> struct.unpack('b', '\x0f') 
(15,) 
+0

看起来'struct.unpack('20b',data)'是我所需要的。谢谢! – ptbrown