【问题标题】:How to send c++ doubles from one system to another Sender: Winsock Receiver: Java如何将 c++ 双打从一个系统发送到另一个发送方:Winsock 接收方:Java
【发布时间】:2013-02-15 19:25:45
【问题描述】:

发送C端

double tmp = htonl(anydouble);
send(socket, (char *) &tmp, sizeof(tmp), 0);

在 Java 端,我将网络数据读入 char[8]

执行转换回双精度的正确方法是什么? 是否可以简单地发送一个字符串并将其解析回双倍?

【问题讨论】:

    标签: java c network-programming double htonl


    【解决方案1】:

    这应该可行。

    char[] sentDouble = readBytes(); // get your bytes char[8]
    String asString = new String(sentDouble); // make a string out of it
    double myDouble = Double.parseDouble(asString); // parse it into a double
    

    使用 byte[] 你可以做到

    import java.nio.ByteBuffer;
    
    public static double toDouble(byte[] bytes) {
        return ByteBuffer.wrap(bytes).getDouble();
    }
    

    【讨论】:

    • 这显然是伪代码。我没有readbytes() 方法。 Doube.parseDouble() 抛出异常,抓住它。
    • 如果我将双精度以人类可读的形式作为字符串发送,但不发送“普通”64Bit,这可能会起作用。
    • 一个 Double 是 8 个字节,所以你需要 byte[8] 或 char[4]。使用 byte[8] 您可以使用我在答案中编辑的内容。
    • +1 用于非字符串解决方案,它不会像我刚才那样重新发明轮子。
    • 使用 ByteBuffer,您需要确保匹配用于发送双精度的字节顺序或确保服务器以网络字节顺序发送它。
    【解决方案2】:

    我建议使用 Google Protocol Buffers:https://developers.google.com/protocol-buffers/docs/overview 它有用于 C 和 Java 以及许多其他语言的库,例如 Python,稍后您可能会发现它们很有用。它高效、健壮、会处理字节序等问题。

    【讨论】:

      【解决方案3】:

      您将 double 重新解释为 long。这不会是便携式的。以下是一些替代方案:

      • 您真的需要使用浮点值吗?您能否将您的值表示为整数(例如毫秒而不是秒)?
      • 将 double 编码为字符串(例如 sprintf 和 Double.parseDouble)
      • 使用 frexp 提取尾数和指数并作为整数发送,然后使用 Double.longBitsToDouble 在 Java 中转换回

      【讨论】:

        【解决方案4】:

        不需要String 开销。先将字节组装成long,然后使用Double's static longBitsToDouble方法。

        // The bit pattern for the double "1.0", assuming most signficant bit first in array.
        char[] charArray = new char[] {0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
        long bytesAsLong = 0L;
        for (int i = 0; i < 8; i++)
        {
           bytesAsLong |= ((long) charArray[i] << (56 - 8*i));
        }
        double value = Double.longBitsToDouble(bytesAsLong);
        System.out.println(value);  // prints "1.0"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          • 1970-01-01
          • 2016-10-04
          • 2017-06-24
          • 1970-01-01
          相关资源
          最近更新 更多