0

发送C端

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

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

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

4

4 回答 4

3

这应该有效。

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();
}
于 2013-02-15T19:28:01.433 回答
1

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

于 2013-02-15T19:30:37.527 回答
1

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

  • 你真的需要使用浮点值吗?您可以将您的值表示为整数(例如毫秒而不是秒)吗?
  • 将双精度值编码为字符串(例如 sprintf 和 Double.parseDouble)
  • 使用 frexp 提取尾数和指数并作为整数发送,然后使用 Double.longBitsToDouble 在 Java 中转换回
于 2013-02-15T20:05:27.660 回答
0

不需要String开销。将字节组装成long第一个,然后使用Double 的静态 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"
于 2013-02-15T19:46:34.740 回答