gpt4 book ai didi

c++ - QDataStream 有时使用 32 位 float ,有时使用 40 位 float

转载 作者:行者123 更新时间:2023-11-30 00:36:36 25 4
gpt4 key购买 nike

我正在编写一个应用程序,该应用程序应该将一组 float 写入 WAVE 文件。我正在为此使用 QDataStream,但这会导致我无法解释的非常不可能的输出。似乎 QDataStream 有时选择 32 位 float ,有时选择 40 位 float 。这会打乱整个输出文件,因为它必须遵守严格的格式。

我的代码大致是这样的:

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 字节数字。有谁知道这可能是什么原因造成的?

编辑:当检查两个 float 的大小时,它们看起来确实有 4 个 char 长,但是:

    qDebug() << sizeof(temp1); // prints '4'
qDebug() << sizeof(temp2); // prints '4'

最佳答案

答案在于输出文件的打开:QIODevice::Text 标志应该被排除在外,因为它是一个二进制文件。如果包含文本标志,则在每个 0a 之前插入一个 0d 字符。因此,每个包含 0a 字符的 float 都因此看起来比 char 长。

此答案的所有学分归于以下给出的答案: Length of float changes between 32 and 40 bit

关于c++ - QDataStream 有时使用 32 位 float ,有时使用 40 位 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15704276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com