我正在尝试使用wave库从wavefile中读取二进制数据。数据被读取并报告为'\ x0f \ x06 \ x0a ...'形式的字符串文字,我想将十六进制数转换为整数(你知道,在十进制中)。我遇到的问题是这些字符串并不是真正被视为十六进制数字,而是类似于unicode字符。
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 :(得分:1)
好的,从评论中可以清楚地看出这是一个二进制文件,而不是字符串文字的文件。没关系 - 我们期望一个.wav
文件是二进制数据。
首先将open()
模式更改为rb
。
然后,如果您读取10个字节,则可以通过
解压缩它们struct.unpack('10b', data)
这将返回10个整数的元组。你快到了; - )
答案 1 :(得分:0)
ord()
会将bytestring元素转换为相应的值。
>>> ord('\x0f')
15
或使用适当大小的struct
转换。
>>> struct.unpack('b', '\x0f')
(15,)