【发布时间】: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
发送C端
double tmp = htonl(anydouble);
send(socket, (char *) &tmp, sizeof(tmp), 0);
在 Java 端,我将网络数据读入 char[8]
执行转换回双精度的正确方法是什么? 是否可以简单地发送一个字符串并将其解析回双倍?
【问题讨论】:
标签: java c network-programming double htonl
这应该可行。
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() 抛出异常,抓住它。
我建议使用 Google Protocol Buffers:https://developers.google.com/protocol-buffers/docs/overview 它有用于 C 和 Java 以及许多其他语言的库,例如 Python,稍后您可能会发现它们很有用。它高效、健壮、会处理字节序等问题。
【讨论】:
您将 double 重新解释为 long。这不会是便携式的。以下是一些替代方案:
【讨论】:
不需要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"
【讨论】: