2015-06-26 106 views
0

我想從Qt中的音頻文件中讀取16位整數採樣值。如何從QFile讀取帶符號的16位整數?

char tempbytes[3]; /// 
int sampleposition; 
int sample; 

QFile file(sourcepath); 

if (! file.open(QIODevice::ReadOnly | QIODevice::Text)) return; 

sampleposition = 120 
file.seek(sampleposition); 
file.read(tempbytes, 2); 

現在我有一個char數組,但我想將它轉換爲16位有符號整數值。波形文件中的字節順序是littleendian。

我已經嘗試過:

sample = qFromLittleEndian<qint16>((uchar*)tempbytes); 

這個工作對一些樣品,但有些是完全錯誤的價值觀誤解。我比較大膽的時間信號的情節。

有沒有更好的方法?

+1

你得到了錯誤的值的原因我們,因爲表達式'(UCHAR *)tempbytes'返回tempbytes'的'內存地址。你得到的價值是地址,而不是音頻樣本。 – RobbieE

回答

2

無論它是否是一個「更好」的解決方案,我覺得很簡單,在這些類型的情況下使用QDataStream。它特別有一個過載reading 16-bit integers

這裏是一個非常簡單的例子:

// Open the file and create our data stream 
QFile file("filename"); 
file.open(QIODevice::ReadOnly); 
QDataStream in(&file); 
in.setByteOrder(QDataStream::LittleEndian); 

// Read a 16-bit sample 
qint16 sample; 
in >> sample 
0

源文件是而不是一個文本文件,所以不要這樣對待它。打開它的正確方法是:

if (! file.open(QIODevice::ReadOnly)) return; 
相關問題