QDataStream有时使用32位和40有时位浮点(QDataStream uses someti

2019-09-28 10:25发布

我写的是应该写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'

Answer 1:

答案就在输出文件的打开:在QIODevice::Text标志应该被排除在外,因为它是一个二进制文件。 如果包含文本的标记, 0d字符每个之前插入0a 。 因此,一个包含每个浮点0a性格似乎char长,因为这一点。

对于这个答案的所有信用去给出答案: 32与40位浮点的长度变化



Answer 2:

注:我不知道我是对的低于100%,并会喜欢听我错了,但是这是我觉得是:

QDataStream有它自己的序列化格式,虽然我没有检查,这可能与这一点。 点是,它并不意味着你正在尝试用它做:只是写任何二进制格式。 您可以使用类,但我相信,你只需要使用writeRawData()方法,并照顾字节顺序等自己。



Answer 3:

我即使我没有使用IODevice ::文本标记类似的问题。 我发现,添加一行

dataStream.device()->setTextModeEnabled(false);

解决了这个问题,以确保您在二进制模式。



文章来源: QDataStream uses sometimes 32 bit and sometimes 40 bit floats
标签: c++ wav qt4.8