读取四字节字符

时间:2014-11-26 19:36:31

标签: c++ qt header

读取wav标题我做错了什么?

前8个字节为:52 49 46 46 94 e5 37 03(前4个字节为字符,后4个字节为int32小端)

QFile wavFile(fileName);
QByteArray wavFileContent = wavFile.readAll();
qDebug() << "The size of the WAV file is: " << wavFileContent.size();

char *fileType = new char[4];
unsigned int fileSize;

QDataStream analyzeHeaderDS(&wavFileContent,QIODevice::ReadOnly);
analyzeHeaderDS.setByteOrder(QDataStream::LittleEndian);

analyzeHeaderDS.readRawData(fileType,4);    // "RIFF"
analyzeHeaderDS >> fileSize;                // File Size

qDebug() << "WAV File Header read:";
qDebug() << "File Type: "  << QString::fromUtf8(fileType);
qDebug() << "File Size: "  << fileSize;

输出结果为:

The size of the WAV file is:  53994908 
WAV File Header read: 
File Type:  "RIFFH??i?5" 
File Size:  53994900 

为什么它不仅仅是“RIFF”而是其他一些东西?我分配了一个4字节的字符并读入4个字符。下一个值(文件大小)是正确的。

1 个答案:

答案 0 :(得分:1)

QString::fromUtf8()期望char的空终止数组。另一方面,您有一个char数组,长度为4,不会终止。因此,您对该方法的调用无法满足要求,并且导致的行为定义不明确。您可以查阅文档以了解此方法的详细信息:http://qt-project.org/doc/qt-5/qstring.html#fromUtf8

如果将数组的长度传递给fromUtf8(),函数将不会查找空终止符:

QString::fromUtf8(fileType, 4);

我不确定fromUtf8()是否是正确的选择。我宁愿怀疑fromLocal8Bit会更合适。所以我有这样的话:

QString::fromLocal8Bit(fileType, 4);