当已经假定__STDC_IEC_559__时,序列化浮点为字节
Serializing floats to bytes, when already assuming __STDC_IEC_559__
如果我用以下代码测试我的代码:
#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字节,并安全地在文件之间或网络之间串行化吗
- 断言我们使用的是IEC 559
- 将结果转换为标准字节顺序(如网络字节顺序)
__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
静态常量布尔为_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类[但它的库很重]
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 如何检查字节数组是protobuf序列化字节数组还是普通字节数组
- 如何在序列化后获取字节数组
- 使用原始字节向量作为提升序列化的存档的任何方法
- 你能用内存反序列化字节吗?
- 为什么非犯罪序列化添加了5个字节零前缀
- 具有3字节块的序列化C 结构
- 在 c++ 中使用 Json 序列化/反序列化字节数组
- 如何通过从文件中读取来反序列化C++的字节数组
- 当已经假定__STDC_IEC_559__时,序列化浮点为字节
- 最语义正确和类型安全的构造从序列化字节数组?(c++ 11)
- C++在不进行*序列化的情况下获取unsodered_set*的字节表示