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'