浮点型和无符号字符数组之间的联合
Union between a Float and an array of unsigned char?
我正在解析一个字节流,一旦收到,就会形成一个uint8
数组。 事先知道数组内容应该是什么,可以是整数、字符串或浮点数。 所需要的只是将数据重新解释为这些类型。 不过,浮动引起了我的一些担忧。
我的问题是,以下结构是否会按预期工作而不会遇到任何意外? (内存混叠、填充、字节序等) 如果没有,那么用尽可能少的代码实现这一目标的最佳方法是什么?
union BytesToFloat{
float f;
uint8 bytes[4];
}
作为背景,此数据源自保存数据,因此写入数据的计算机可能与读取数据的计算机不同。
编辑
在阅读了有关字节序的评论之一后,这种结构和帮助功能是否更适合,或者字节序仍然是一个问题(或者除此之外还有其他麻烦)
union IntToFloat{
float f;
uint32 i;
};
uint32 CharToLong(unsigned char * c){
uint32 val = c[0];
val <<= 8;
val |= c[1];
val <<= 8;
val |= c[2];
val <<= 8;
val |= c[3];
return val;
}
4
替换为sizeof(float)
来稍微提高union
的可靠性(理论上比实践上更多)。
但是,您必须通过网络面对其他问题。 不能保证连接的两端都使用 IEEE 754 浮点格式(例如,IBM 的 zSeries 大型机)。 也不能保证双方使用相同的字节顺序(英特尔架构使用小端序,大多数其他架构使用大端序)。 您需要知道源计算机和目标计算机的字节顺序才能正确解释数据(但是 IBM 用于与 SQL DBMS 通信的 DRDA 协议的工作方式是这样的,具有"接收器使正确"约定)。
字节序和字节顺序问题是实际问题;浮点格式往往不是一个问题,除非你希望使用大型机系统(它们往往是IEEE 754的坚持者,主要是因为它们的格式在IEEE 754标准化之前就已经解决了)。
通常,传送数据的最佳方式是使用纯文本格式。 它具有易于调试和避免许多(但不是全部)数字表示难题的优点。 但是,如果您的主要协议是二进制的,则将其更改为浮点文本看起来很奇怪。
是的,可能会有惊喜。 在两端。
该代码将如何工作将在读取和写入时定义实现。
从好的方面来说,传输介质(网络或磁盘)通常非常慢,以至于添加代码以使读取/写入确定性不会对性能产生重大影响。
另一个好处是代码很少需要在任意平台上运行。 确保您正在做的事情在您支持的每个平台上都有效并且您很好。
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 动态分配的数组和静态数组之间的区别
- 删除[i] 数组和删除数组 [i] 之间的区别
- 当数组位于两个循环之间时,您可以调用数组的 void 函数吗?
- 处理数组时make_unique和make_shared之间的差异
- 在两个结构之间共享数组
- C++堆栈中数组之间的间隙
- 类型测试对象的动态数组的这两个声明之间的区别?
- 如何计算大小为 1000 x 1000 的 2D 数组中 2 个元素之间的步幅?C++
- sizeof(空结构)和sizeof(带有空数组的结构)之间的区别?
- 尝试查找数组中点之间的最小距离时的随机垃圾输出
- 如何在带有 mbed 的 nucleo f446re 之间通过带有 UARTSerial 类的 USB 发送字节数组?
- 在给定的整数数组中,可以找到在给定位置之间分类数组的整数之和
- 这两个代码之间的差异(为什么我的数组也有额外的空间,即使我限制了它)
- 使用STD :: String和字符数组之间的选择
- 如何在不复制数据的情况下在平面数组和多维数组之间进行转换?
- 在函数之间传递相同的数组
- 如果 strlen 在 char 数组之间遇到空格,它会怎么做