0

送信 C 側

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

Java 側では、ネットワーク データを char[8] に読み込みます。

double への変換を実行する適切な方法は何ですか? 単に文字列を送信し、それを解析して double に戻す方法はありますか?

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

あなたはダブルを長さとして再解釈しています。これはポータブルではありません。いくつかの選択肢があります:

  • 本当に浮動小数点値を使用する必要がありますか?値を整数(秒ではなくミリ秒など)で表すことができますか?
  • doubleを文字列としてエンコードします(例:sprintfおよびDouble.parseDouble)
  • frexpを使用して仮数と指数を抽出し、整数として送信してから、Double.longBitsToDoubleを使用してJavaに変換し直します。
于 2013-02-15T20:05:27.660 に答える
1

Google Protocol Buffers を使用することをお勧めします。効率的で堅牢で、エンディアンなどを処理します。

于 2013-02-15T19:30:37.527 に答える
0

Stringオーバーヘッドは必要ありません。バイトをlong最初に組み立ててから、 Double の 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"
于 2013-02-15T19:46:34.740 に答える