如果我使用以下代码测试我的代码:
#ifndef __STDC_IEC_559__
#error Warning: __STDC_IEC_559__ not defined. The code assumes we're using the IEEE 754 floating point for binary serialization of floats and doubles.
#endif
...如here所述,我保证这一点:
float myFloat = ...;
unsigned char *data = reinterpret_cast<unsigned char*>(&myFloat)
unsigned char buffer[4];
std::memcpy(&Buffer[0], data, sizeof(float));
...会安全地序列化浮点数以写入文件或网络数据包吗?
如果没有,我怎样才能安全地序列化浮点数和双打?
另外,谁负责字节排序 - 我的代码或操作系统?
澄清我的问题:我可以将浮点数转换为4个字节并加倍到8个字节,并安全地序列化文件或跨网络,如果我:
答案 0 :(得分:2)
__STDC_IEC_559__
是由C99 / C11定义的宏,我没有找到关于C ++是否保证支持它的参考。
更好的解决方案是使用std::numeric_limits< float >::is_iec559
或std::numeric_limits< double >::is_iec559
C ++ 11 18.2.1.1类模板numeric_limits
static const bool is_iec559;
52当且仅当类型符合IEC 559标准时才为真.210)
53对所有浮点类型都有意义。
在脚注中:
210)国际电工委员会标准559与IEEE 754相同。
关于你的第二个假设,我认为你不能说任何字节顺序都是“标准”,但如果机器之间的字节顺序是相同的(小端或大端),那么是的,我认为你可以序列化这一点。
答案 1 :(得分:1)
如何考虑像XDR [在Unix RPC中使用]或CDR等标准序列化?
http://en.wikipedia.org/wiki/External_Data_Representation
例如: bool_t xdr_float(XDR * xdrs,float * fp);来自linux.die.net/man/3/xdr
或c ++库 http://xstream.sourceforge.net/
你可能也会在CDR中使用[由CORBA使用],ACE [自适应通信环境]有CDR类[但它非常重的库]