在已经假设__STDC_IEC_559__时将浮点数序列化为字节

时间:2013-07-22 05:15:16

标签: c++ serialization c++11 floating-point ieee-754

如果我使用以下代码测试我的代码:

#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个字节,并安全地序列化文件或跨网络,如果我:

  1. 断言我们正在使用IEC 559
  2. 将结果转换为标准字节顺序(例如网络字节顺序)。

2 个答案:

答案 0 :(得分:2)

__STDC_IEC_559__是由C99 / C11定义的宏,我没有找到关于C ++是否保证支持它的参考。

更好的解决方案是使用std::numeric_limits< float >::is_iec559std::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类[但它非常重的库]