我正在编写二进制文件读取器/写入器,并决定要处理字节序问题,我会将所有数据转换为" network" (大)写作时的字节顺序和读取时的主机字节序。我避免hton*
,因为我不想仅仅为这些功能与winsock建立链接。
我的主要困惑来自于如何处理浮点值。对于所有整数值,我在<cstdint>
(uint32_t
等)中都有大小的类型,但是从我的研究中看,浮点类型没有这样的等价物。我希望在写入时将所有浮点值转换为32位表示,并将其转换回主机上使用的任何精度(对于我的应用程序,32位就足够了)。这样我就可以精确地知道浮点值的写入和读取字节数;而不是如果我使用sizeof(float)
和sizeof(float)
在加载文件的机器上与编写它的机器不同。
我刚刚意识到使用frexp
以整数方式获取尾数和指数,将这些整数写出(具有一些固定大小),然后读取整数并重构浮点值的可能性使用ldexp
。这看起来很有希望,但是我想知道在没有htonf
/ ntohf
的情况下是否存在任何普遍接受或推荐的处理浮点字符串的方法。
我几乎可以肯定地知道我将很快定位的任何平台将float
代表32位,但我想让我现在编写的代码与我兼容可用于未来的项目。
答案 0 :(得分:2)
如果您想要完全跨平台且符合标准,那么frexp
/ ldexp
解决方案是最好的方法。 (尽管您可能需要考虑源或目标硬件使用十进制浮点的高度理论情况。)
假设一台或另一台机器没有32位浮点表示。然后,该机器上没有与32位浮点指针编号兼容的数据类型,无论字节顺序如何。因此,没有标准的方法将非32位浮点数转换为可传输的32位表示,或者将传输的32位表示转换为本机非32位浮点数。
您可以将范围限制为具有32位浮点表示的计算机,但是您需要假设两台计算机具有相同的数字和位专用于符号,指数和尾数。情况可能就是这样,因为IEEE-754格式现在几乎是通用的,但C ++并不坚持它,至少可以想象有一台机器可以实现1/8/23位浮点数。在低阶端而不是高阶端签名位。
简而言之,字节序只是二进制浮点格式之间可能存在的不兼容性之一。但是,将每个浮点数减少到两个整数可以避免必须处理其他不兼容性(基数除外)。