c++ - Float 和 unsigned char 数组之间的 union ?

标签 c++ floating-point

我正在解析一个字节流,一旦接收到这些字节流,就会形成一个 uint8 数组。事先知道数组内容应该是什么,可以是整数、字符串或 float 。所需要做的就是将数据重新解释为这些类型。不过, float 让我有些担心。

我的问题,以下结构是否会按预期工作而不会遇到任何意外? (内存别名、填充、字节顺序等)如果不是,用尽可能少的代码实现这一目标的最佳方法是什么?

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 协议(protocol)就是这样工作的,遵循“接收者做出正确的决定”约定)。

字节顺序和字节顺序问题是实际问题;除非您希望使用大型机系统,否则浮点格式往往不是一个问题(它们往往是 IEEE 754 的保留者,主要是因为它们的格式在 IEEE 754 标准化之前就已确定)。

通常,传输数据的最佳方式是使用普通 text格式。它具有易于调试和避免许多(但不是全部)数字表示难题的优点。但是,如果您的主要协议(protocol)是二进制的,将其更改为浮点文本看起来会很奇怪。

关于c++ - Float 和 unsigned char 数组之间的 union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14535865/

相关文章:

c++ - audiodg.exe 随着我调用的每个 Beep() 函数不断增长。系统不释放内存

c++ - 为什么 C++ io 流的循环在第一次迭代后中断?

java - java中的 float 和 double 有多少位有效数字?

c++ - 如何使用 Xcode 4.6.2 到 7.1.1 恢复对 Mac OS X 10.6 部署的 c++0x/c++11 支持

c++ - 仿函数:将 std::function 包装在类中

javascript - 您如何知道 JavaScript float 何时不会被舍入?

python - 什么定义了 python 中的浮点精度?

floating-point - float256 中指数和分数的大小

ios - Int to format %.2f 在 iPhone 5 上返回意外数字

c++ - SFML 自动运动