3

我正在编写一个二进制文件读取器/写入器,并决定为了处理字节序问题,我将在写入时将所有数据转换为“网络”(大)字节序,在读取时转换为主机字节序。我正在避免hton*,因为我不想仅仅为了这些功能而与 winsock 链接。

我的主要困惑来自如何处理浮点值。对于所有整数值,我在<cstdint>(uint32_t等) 中都有大小类型,但根据我的研究,浮点类型不存在这样的等价物。我想在写入时将所有浮点值转换为 32 位表示并转换回主机上使用的任何精度(32 位对于我的应用程序来说已经足够了)。这样我就可以准确地知道要为浮点值写入和读取多少字节;相反,如果我在加载文件的机器上使用sizeof(float)并且与编写文件的机器不同。sizeof(float)

我刚刚意识到可以使用frexp以整数形式获取尾数和指数,将这些整数写出(具有一些固定大小),然后读入整数并使用ldexp. 这看起来很有希望,但我想知道是否有任何普遍接受或推荐的方法来处理没有htonf/ntohf的浮点字节序。

我几乎可以肯定地知道,我很快将瞄准的任何平台都将float用 32 位表示,但我想让我现在编写的代码尽可能兼容,以便在未来的项目中使用。

4

1 回答 1

2

如果您想完全跨平台且符合标准,那么frexp/ldexp解决方案是最好的选择。(尽管您可能需要考虑源硬件或目标硬件使用十进制浮点的高度理论化的情况。)

假设一台或另一台机器没有 32 位浮点表示。然后,无论字节顺序如何,该机器上都没有与 32 位浮点数兼容的数据类型。因此,没有标准方法可以将非 32 位浮点数转换为可传输的 32 位表示,或将传输的 32 位表示转换为本地非 32 位浮点数。

您可以将范围限制在具有 32 位浮点表示的机器上,但是您需要假设两台机器具有相同数量和顺序的专用于符号、指数和尾数的位。很可能是这样,因为 IEEE-754 格式现在几乎是通用的,但是 C++ 并不坚持它,至少可以想象有一台机器可以实现 1/8/23 位浮点数符号位在低位端而不是高位端。

简而言之,字节序只是二进制浮点格式之间可能的不兼容之一。然而,将每个浮点数减少为两个整数,避免了处理其他不兼容问题(除了基数)。

于 2014-03-30T04:09:28.400 回答