C++ 问题:我在将双精度数组(单精度 32 位)写入 4 字节 IEEE754 格式的光盘文件时遇到问题
C++ question: I'm having problems writing array of doubles (single precision 32 bit) to a disc file as 4-byte IEEE754 format
我有一个正在尝试编写的应用程序,它将采用 table 个数字(由用户生成)并将 table 写入光盘上的文件。该文件稍后将通过 USB 传输到 Arduino AVR 设备的 EEPROM。
我希望将此信息保存在光盘上的格式是 4 字节 Little Endian 作为原始十六进制数据。我在下面的代码中名为“tbl1Array[]”的 table 数组已转换为双精度数。
下面是我现在使用的代码片段,内嵌在一些数组准备代码之后。文件 open/close 工作正常,事实上,数据确实被传输到文件,但格式不是我想要的。
ofstream fileToOutput("318file.bin");
for (int i=0; i<41; i++)
{
fileToOutput << tbl1Array[i];
}
fileToOutput.close();
问题是写入文件的是十进制值的十六进制 ASCII 表示。不是我想要的!我不知道我需要做什么才能让我的数组成为我的双打的 4 字节 Little Endian 字的一个漂亮整洁的串联列表,我以后可以从 Arduino 代码中读取它。我有一个使用 AVRDUDE(经过测试和确认)将文件传输到 Arduino 的工作方法,所以我唯一真正的挂断是将我的应用程序数组中的这些双打转换为光盘上的 4 字节 IEEE754。任何指导将不胜感激。
此致 - 马克
在文本流中,new-line 字符被翻译。一些操作系统翻译成 \r\n
。二进制流保持原样。
无论您如何打开流 – 二进制或文本:
一个。当您使用 insertion/extraction 运算符时,数据被写为 text。假设0x01
是一个字节整数,那么ASCII会写成1
(即0x31
)。
b。如果使用 ostream::write
方法,则写入 actual bytes;没有翻译发生。假设0x01
是一个单字节整数,那么0x01
就会写成
如果要写入实际字节,以二进制模式打开流并使用ostream::write
:
ofstream os{ "out.bin", ios::binary };
if (!os)
return -1;
double d = 1.234567;
os.write((const char*)&d, sizeof d);
如果要将实际字节写入字符串,以文本模式打开流并使用插入运算符:
ofstream os{ "out.txt" };
if (!os)
return -1;
double d = 1.234567;
static_assert(sizeof(double) == sizeof(long long));
os << hex << *reinterpret_cast<long long*>(&d);
如果你想写一个double as string,使用最大精度使用:
os << setprecision(numeric_limits<double>::max_digits10) << d;
不要在同一流中使用已翻译和未翻译的方法。
我不知道以上所有示例是否都适用于 Arduino 编译器。
我有一个正在尝试编写的应用程序,它将采用 table 个数字(由用户生成)并将 table 写入光盘上的文件。该文件稍后将通过 USB 传输到 Arduino AVR 设备的 EEPROM。 我希望将此信息保存在光盘上的格式是 4 字节 Little Endian 作为原始十六进制数据。我在下面的代码中名为“tbl1Array[]”的 table 数组已转换为双精度数。 下面是我现在使用的代码片段,内嵌在一些数组准备代码之后。文件 open/close 工作正常,事实上,数据确实被传输到文件,但格式不是我想要的。
ofstream fileToOutput("318file.bin");
for (int i=0; i<41; i++)
{
fileToOutput << tbl1Array[i];
}
fileToOutput.close();
问题是写入文件的是十进制值的十六进制 ASCII 表示。不是我想要的!我不知道我需要做什么才能让我的数组成为我的双打的 4 字节 Little Endian 字的一个漂亮整洁的串联列表,我以后可以从 Arduino 代码中读取它。我有一个使用 AVRDUDE(经过测试和确认)将文件传输到 Arduino 的工作方法,所以我唯一真正的挂断是将我的应用程序数组中的这些双打转换为光盘上的 4 字节 IEEE754。任何指导将不胜感激。 此致 - 马克
在文本流中,new-line 字符被翻译。一些操作系统翻译成
\r\n
。二进制流保持原样。无论您如何打开流 – 二进制或文本:
一个。当您使用 insertion/extraction 运算符时,数据被写为 text。假设
0x01
是一个字节整数,那么ASCII会写成1
(即0x31
)。b。如果使用
ostream::write
方法,则写入 actual bytes;没有翻译发生。假设0x01
是一个单字节整数,那么0x01
就会写成如果要写入实际字节,以二进制模式打开流并使用
ostream::write
:ofstream os{ "out.bin", ios::binary }; if (!os) return -1; double d = 1.234567; os.write((const char*)&d, sizeof d);
如果要将实际字节写入字符串,以文本模式打开流并使用插入运算符:
ofstream os{ "out.txt" }; if (!os) return -1; double d = 1.234567; static_assert(sizeof(double) == sizeof(long long)); os << hex << *reinterpret_cast<long long*>(&d);
如果你想写一个double as string,使用最大精度使用:
os << setprecision(numeric_limits<double>::max_digits10) << d;
不要在同一流中使用已翻译和未翻译的方法。
我不知道以上所有示例是否都适用于 Arduino 编译器。