2012-04-06 27 views
1

私はC32コンパイラを実行するPIC32エンベデッドマイクロコントローラを持っています。私は64ビットのdouble値を含むUDPパケットをJavaプログラムに送ります。私のテストでは、Javaに10進値40.5を送信しようとしています。IEEE 754倍精度のMIPS CからJavaへの変換

私が受け取ることを期待する: 0x4044400000000000

以来 のSystem.out.println(Double.longBitsToDouble(0x4044400000000000L));

プリント:私は任意の変換をせずにUDPパケットを送信する場合、私は受けてい 40.5

: 0x00002242352D3330

私は、Javaにこの値を取得することができますどのように任意のアイデア?私はダブルのC32表現の頭や尾を作ることはできません。

+2

はエンディアン同じですか? – dbrank0

+0

実際にはsizeof(double)はPIC上で8ですか?あなたはダブルでhtonlをどう呼んでいますか? – Collin

+0

どうやってこれをjavaに引っ張っていますか? –

答えて

2

PIC32はリトルエンディアンです。 doubleは64ビットで表され、longは32ビットである。 64ビットの場合はlong longが必要です。上記のように、longをとる。あなたはキャストでそれを切り捨てており、エンディアン変換の後、あなたは表示された結果を得ています。

pastebinにこれが見つかりました。それはあなたの64ビットlong longを変換するために動作するはずのマクロです:

#define htonll(x) \ 
((((x) & 0xff00000000000000LL) >> 56) | \ 
(((x) & 0x00ff000000000000LL) >> 40) | \ 
(((x) & 0x0000ff0000000000LL) >> 24) | \ 
(((x) & 0x000000ff00000000LL) >> 8) | \ 
(((x) & 0x00000000ff000000LL) << 8) | \ 
(((x) & 0x0000000000ff0000LL) << 24) | \ 
(((x) & 0x000000000000ff00LL) << 40) | \ 
+0

が便利です。 htonlは私のデータの一部を切り捨てています。私はまた、構造体のパッキングの問題を発見しました。質問は私が今送信している現在のデータで更新されました。 –

+0

+1これは便利で、JavaやPICで実行することができるので –

+1

このマクロは '#if LITTLE_ENDIAN ... #else #define htonll(x)x#endif'のようなものでラップされていると便利です。それであなたは移植可能なコードを持っているからです。 –

1

htonl()long、ないdoubleかかります。

関連する問題