解包“0xff”与“\ xff”

时间:2013-09-22 03:41:10

标签: python

我正在尝试使用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'。

2 个答案:

答案 0 :(得分:1)

好的,从评论中可以清楚地看出这是一个二进制文件,而不是字符串文字的文件。没关系 - 我们期望一个.wav文件是二进制数据。

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

然后,如果您读取10个字节,则可以通过

解压缩它们
struct.unpack('10b', data)

这将返回10个整数的元组。你快到了; - )

答案 1 :(得分:0)

ord()会将bytestring元素转换为相应的值。

>>> ord('\x0f')
15

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

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