2013-09-22 91 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