我正在用QT写一个播放器,想判断打开的文件是否为合法的WMA格式,我选用的是fread函数,但读取结果与实际结果不同。程序如下:
bool Music::isLegal(QString media) {
if(QFile(media).size() < 1024)
return false;
FILE *fp = fopen(media.toUtf8().data(),"rb");
if(fp == nullptr)
return false;
size_t size = QFile(media).size();
return Music::isWav(fp,size)||
Music::isMP3(fp)||
Music::isWma(fp)||
Music::isAiff(fp,size);
}
其中isWma函数实现如下:
bool Music::isWma(FILE *media) {
static constexpr int BASE = 16 / sizeof(uint);
static const uint s[BASE] = {0x75b22630u,0x11cf668eu,0xaa00d9a6u,0x6cce6200u};
uint *first_16B = new uint[BASE]();
fread(first_16B,sizeof(uint),BASE,media);
for(int i = 0; i < BASE; i++) {
if(first_16B[i] != s[i])
return false;
}
delete [] first_16B;
return true;
}
但当我读取一个合法的WMA文件时却返回false。我知道这样判断不严谨,但当我使用其他编译器时却能够正确判断,请问这是为什么呢?
环境为QT5.12+MinGW(GCC 7.3)+Win10 X64
错误:
return Music::isWav(fp,size)||
在或的关系中,如果第一个为false,那么再执行第二个,依次类推,所以当你判断到isWma时,前面读取的数据流已经到Wav+MP3头大小之后了,所以你每次读取之前移动读取指针到文件头,或者为了简洁放弃一点性能,不要传递fp参数,改成文件名