使用C ++,Windows 7,Intel 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值的数字写为自己的字节。我会感激任何知道这里发生了什么的人。我不知所措。
答案 0 :(得分:5)
这是因为两个错误:第一个是当你打开没有指定openmode的文件时,它在文本模式下打开,你希望它是二进制的:
std::ofstream outfile(filename.c_str(), std::ios::out | std::ios::binary);
另一个错误是您使用文本输出运算符<<
。您需要write
数据:
outfile.write(reinterpret_cast<const char*>(&scaledVal), sizeof scaledVal);
答案 1 :(得分:1)
<<
运算符格式化数字并打印人类可读的字符串表示。
如果要写实际字节,请使用 unformatted I / O:
outfile.write(reinterpret_cast<char const *>(&scaledVal), sizeof scaledVal);
答案 2 :(得分:1)
您可能会发现此模板功能很有用:
template <typename T>
inline void writeRaw(std::ostream &stream, T const &data)
{
stream.write((char const *) &data, sizeof(data));
}
答案 3 :(得分: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));