C++ QDataStream有时使用32位浮点,有时使用40位浮点
我正在编写一个应用程序,它应该将一个浮点数组写入一个WAVE文件。我正在为此使用QDataStream,但这导致了一个我无法解释的非常不可能的输出。QDataStream有时选择32位浮点,有时选择40位浮点。这会弄乱整个输出文件,因为它必须遵循严格的格式 我的代码大致如下所示:C++ QDataStream有时使用32位浮点,有时使用40位浮点,c++,wav,qt4.8,C++,Wav,Qt4.8,我正在编写一个应用程序,它应该将一个浮点数组写入一个WAVE文件。我正在为此使用QDataStream,但这导致了一个我无法解释的非常不可能的输出。QDataStream有时选择32位浮点,有时选择40位浮点。这会弄乱整个输出文件,因为它必须遵循严格的格式 我的代码大致如下所示: float* array; unsigned int nSamples; void saveWAV(const QString& fileName) const { QFile outFile(fi
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];
}
}
我非常随意地选择了这些值,它们恰好具有这种效果。一些值导出为4字节,其他值导出为5字节数字。有人知道这可能是什么原因吗
编辑:
当检查两个浮点数的大小时,它们看起来确实有4char
s长,不过:
qDebug() << sizeof(temp1); // prints '4'
qDebug() << sizeof(temp2); // prints '4'
qDebug()注意:我不是100%确定我是对的,我很想听到我错了,但我认为是这样的:
它有自己的序列化格式,虽然我没有检查,但这可能与此有关。关键是,它并不意味着你要用它做什么:只写任何二进制格式。您可以使用该类,但我相信您只需要使用方法,并自己处理字节顺序等。答案在于打开输出文件:应该省略QIODevice::Text
标志,因为它是一个二进制文件。如果包含文本标志,则在每个0a
之前插入一个0d
字符。因此,每个包含0a
字符的浮点看起来都比char
长
此答案的所有学分均计入以下给出的答案:
即使我没有使用IODevice::Text标志,我也遇到了类似的问题。我发现添加一行
dataStream.device()->setTextModeEnabled(false);
解决了这个问题,以确保您处于二进制模式。谢谢,这至少提供了一种不用for循环的方法;太好了。但它仍然会产生相同的不一致性,一些浮动比其他浮动长!这似乎意味着数组中的浮点是可变长度的(4或5字节),这似乎真的不太可能。
qDebug() << sizeof(temp1); // prints '4'
qDebug() << sizeof(temp2); // prints '4'
dataStream.device()->setTextModeEnabled(false);