c++ - 读取四字节字符

标签 c++ qt header

我在读取 wav header 时做错了什么?

前 8 个字节是:52 49 46 46 94 e5 37 03(第一个 4 个字节是字符,最后 4 个字节是 int32 little endian)

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 个字符。下一个值(文件大小)是正确的。

最佳答案

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

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

QString::fromUtf8(fileType, 4);

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

QString::fromLocal8Bit(fileType, 4);

关于c++ - 读取四字节字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157510/

相关文章:

c++ - AES 限制和混合列

c++ - Qt从其他Layout中移除Layout

c++ - 类构造函数错误,类 "classname"没有成员 "classname"

c++ - 在 sudo 中加载共享库时出错

c++ - 使用推力的 ODE 求解器的 CUDA 编程

c++ - 没有 Qt3D 的 QCircularBuffer 功能

css - 将页脚固定在页面底部,并在顶部固定导航

pdf - dompdf:如何在除第一页之外的所有页面上添加页眉?

c++ - 尝试使用Windows Midi API时出现gcc错误

c++ - Meego Nokia N950 是否支持 C++ QML 绑定(bind)?