0

使用 C++、Windows 7、英特尔 CPU。

我想要做的是将浮点值 [-1, 1] 映射到 16 位有符号值并将它们写入文件。最明显的做法似乎是将浮点值乘以 32768 (2^16 / 2),然后简单地写入它们。当我这样做时会发生以下情况:

    std::ofstream outfile(filename.c_str());
    float hypotheticalFloat = 0.25;
    int16_t scaledVal = hypotheticalFloat*32768;
    outfile << scaledVal;

然后八进制转储命令告诉我我有

    $ od -cd output.pcm
    0000000   8   1   9   2
              12600   12857

在我看来,它将每个 int16_t 值的数字写成自己的字节。我会感谢任何知道这里发生了什么的人。我不知所措。

4

4 回答 4

5

这是因为两个错误:第一个是当您打开没有指定openmode的文件时,它以文本模式打开,并且您希望它是二进制的:

std::ofstream outfile(filename.c_str(), std::ios::out | std::ios::binary);

另一个错误是您使用了文本输出运算符<<。你需要write数据:

outfile.write(reinterpret_cast<const char*>(&scaledVal), sizeof scaledVal);
于 2013-05-24T13:42:44.857 回答
1

<<运算符格式化数字并打印人类可读的字符串表示。

如果要写入实际字节,请使用未格式化的I/O:

outfile.write(reinterpret_cast<char const *>(&scaledVal), sizeof scaledVal);
于 2013-05-24T13:44:30.517 回答
1

您可能会发现此模板函数很有用:

template <typename T>
inline void writeRaw(std::ostream &stream, T const &data)
{
    stream.write((char const *) &data, sizeof(data));
}
于 2013-05-24T13:52:27.970 回答
0

您需要以“二进制”模式打开文件。

并且您需要使用该write函数来写入值。

std::ofstream outfile(filename.c_str(), ios:binary);
float hypotheticalFloat = 0.25;
int16_t scaledVal = hypotheticalFloat*32768;
outfile.write((char *)&scaledVal, sizeof(scaledVal)); 
于 2013-05-24T13:45:36.537 回答