3

我正在解析一个字节流,一旦接收到它,就会形成一个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

2 回答 2

1

您可以union通过4sizeof(float).

但是,您必须面对网络上的其他问题。无法保证连接的两端都使用 IEEE 754 浮点格式(例如,IBM 的 zSeries 大型机)。也不能保证双方使用相同的字节顺序(英特尔架构使用小端,大多数其他架构使用大端)。您需要知道源计算机和目标计算机的字节顺序才能正确解释数据(但是 IBM 用于与 SQL DBMS 通信的 DRDA 协议就是这样工作的,采用“接收者正确”约定)。

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

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

于 2013-01-27T01:54:05.593 回答
0

是的,可能会有惊喜。在两端。

该代码将如何工作将在读写时定义。

从好的方面来说,传输介质(网络或磁盘)通常非常慢,以至于添加代码以使读/写具有确定性不会对性能产生重大影响。

另一个好处是代码很少需要在任意平台上运行。确保你正在做的事情在你支持的每个平台上都有效,并且你很好。

于 2013-01-26T10:18:35.087 回答