当已经假定__STDC_IEC_559__时,序列化浮点为字节

Serializing floats to bytes, when already assuming __STDC_IEC_559__

本文关键字:序列化 字节 IEC STDC      更新时间:2023-10-16

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

#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

正如这里所描述的,我能保证吗:

float myFloat = ...;
unsigned char *data = reinterpret_cast<unsigned char*>(&myFloat)
unsigned char buffer[4];
std::memcpy(&Buffer[0], data, sizeof(float));

是否可以安全地序列化float以写入文件或网络数据包?

如果没有,如何安全地序列化float和doubles?

此外,谁负责字节排序——我的代码还是操作系统?

为了澄清我的问题:如果我:,我可以将浮点转换为4字节,将双精度转换为8字节,并安全地在文件之间或网络之间串行化吗

  1. 断言我们使用的是IEC 559
  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

静态常量布尔为_iec559;

52当且仅当类型符合IEC 559标准时为真。210)

53对所有浮点类型都有意义。

脚注中:

210)国际电工委员会标准559与IEEE 754相同。

关于你的第二个假设,我不认为你可以说任何字节顺序都是"标准"的,但如果机器之间的字节顺序是相同的(小端或大端),那么是的,我认为你可以这样序列化。

考虑像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类[但它的库很重]