【问题标题】:Best way to serialize a Float in java to be read by C++ app?在Java中序列化Float以供C ++应用程序读取的最佳方法?
【发布时间】:2010-11-18 11:45:03
【问题描述】:

我需要序列化一个 java Float,以供用 C++ 编写的应用程序通过 Socket 通信读取。这有标准吗?在 Float 类中使用方法 floatToIntBits 是最简单的,但我不确定这有多标准。

【问题讨论】:

    标签: java c++ serialization


    【解决方案1】:

    事实上,这是相当标准的。 floatToIntBits 函数为您提供浮点的 IEEE 编码的实际字节。唯一的问题是字节将是大端的,因此在读入 C++ 应用程序时必须颠倒字节顺序。 (除非你的 C++ 平台也是大端的!)

    【讨论】:

    • 标准是 IEEE 754...另外,大端也称为“网络字节顺序”,是通常用于网络上的二进制数据的端序。
    【解决方案2】:

    使用Float.floatToIntBits()(或Float.floatToRawIntBits(),如果您想保留NaN 值)将浮点数转换为整数。 floatToIntBits() 被指定以 IEEE 754 格式返回整数,这是几乎所有 C/C++ 实现所使用的格式。然后,您应该将整数转换为网络字节顺序(大端)的字节数组,然后您可以安全地将其序列化为文件、套接字、字节流等:

    int floatBits = Float.floatToIntBits(myFloat);
    byte floatBytes[] = new byte[4];
    floatBytes[0] = (byte)(floatBits >> 24);
    floatBytes[1] = (byte)(floatBits >> 16);
    floatBytes[2] = (byte)(floatBits >> 8);
    floatBytes[3] = (byte)(floatBits);
    

    【讨论】:

    • 你确定这是正确的吗?我认为你需要 >>> 转变而不是 >>
    • @martinus:在这种情况下没有区别。由于转换为byte 只查看底部 8 位,因此移入顶部 8-24 位的值(>> 的情况下为 0,>>> 的情况下为符号位的副本) 没关系。
    • 啊,现在我终于明白这>>>是做什么的了:)
    【解决方案3】:

    除非你真的需要它是二进制的,无论是出于带宽还是速度的原因,我个人只会将它转换为字符串。它避免了各种二进制兼容性问题。

    【讨论】:

    • ...那么,这会不会引入字符串编码(Unicode/Ansi/etc)的问题?
    • 数字在编码中是相当标准的。
    • 除了紧凑性之外的另一个原因是性能——Java 执行的精确字符串到双精度(反之亦然)转换与直接追加字节之间存在多个数量级的差异。跨度>
    • @StaxMan,您不同意“或速度原因”的哪一部分?
    • 我不同意评论本身——我同意,这是使用的两个理由,如果它们无关紧要,不需要使用二进制——但只是想提一下这种差异可能非常重要,比大多数其他数据类型更重要。例如,将整数转换为字符串或从字符串转换并不是那么慢(相对而言)。同样,带宽差异并不像性能那样明显有利于二进制格式。
    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 2014-05-14
    • 2010-12-30
    • 2012-10-30
    • 2010-11-20
    • 2010-12-27
    • 2010-09-30
    • 2012-03-02
    相关资源
    最近更新 更多