我写的是应该写float数组到WAVE文件的应用程序。 我使用这个操作QDataStream,但这会导致一个非常不可能的输出,我无法解释。 这似乎是QDataStream有时选择32位浮点数,有时40位浮点。 这打乱了完整的输出文件,因为它必须遵守严格的格式。
我的代码大致是这样的:
float* array;
unsigned int nSamples;
void saveWAV(const QString& fileName) const
{
QFile outFile(fileName);
if (outFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QDataStream dataStream(&outFile);
dataStream.setByteOrder(QDataStream::LittleEndian);
dataStream.setFloatingPointPrecision(QDataStream::SinglePrecision);
// ... do all the WAV file header stuff ...
for(int ii = 0; ii < nSamples; ++ii)
dataStream << array[ii];
}
}
我能想到的没有理由的这段代码如何能有这样的副作用。 所以我做了一个小例子,找出发生了什么事情。 我该换成for循环:
float temp1 = 1.63006e-33f;
float temp2 = 1.55949e-32f;
dataStream << temp1;
dataStream << temp1;
dataStream << temp2;
dataStream << temp1;
dataStream << temp2;
然后我打开用Matlab输出文件,并看看在书面文件的字节数。 那些是:
8b 6b 07 09 // this is indeed 1.63006e-33f (notice it's Little Endian)
8b 6b 07 09
5b f2 a1 0d 0a // I don't know what this is but it's a byte to long
8b 6b 07 09
5b f2 a1 0d 0a
我选择了非常随意,他们只是碰巧有这种效果的值。 一些值被导出为4字节和其他的5个字节的数字。 有没有人有任何想法可能是这个原因吗?
编辑:在检查这两种漂浮的大小,他们似乎是4个char
已久,但:
qDebug() << sizeof(temp1); // prints '4'
qDebug() << sizeof(temp2); // prints '4'