2012-04-06 71 views
1

我有一個運行C32編譯器的PIC32嵌入式微控制器。我正在向Java程序發送一個包含64位double值的UDP數據包。在我的測試中,我試圖將十進制值40.5發送給Java。從MIPS C到Java轉換的IEEE 754雙精度數字

我希望收到: 0x4044400000000000

因爲 的System.out.println(Double.longBitsToDouble(0x4044400000000000L));

打印: 40.5

如果我發送UDP數據包沒有任何轉換,我收到: 0x00002242352D3330

任何想法,我怎麼能得到這個值轉換成Java?我無法制作雙面C32表示的正面或反面。

+2

Endianness是否一樣? – dbrank0 2012-04-06 13:11:26

+0

PIC上的sizeof(double)實際上是8嗎?你怎麼打電話給雙人? – Collin 2012-04-06 13:14:31

+0

你怎麼把它拉到java? – 2012-04-06 13:30:19

回答

2

PIC32是小端。 A double由64位表示,並且long是32位。對於64位,您需要一個long long

htonl()需要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正在截斷我的一些數據。我還發現了一個結構封裝問題,我也消除了。問題已經更新,我現在正在發送並正在接收的實際數據。 – 2012-04-06 14:04:09

+0

+1,因爲這是有用的,可以運行在java或PIC上 – 2012-04-06 14:05:34

+1

如果它被封裝在像'#if LITTLE_ENDIAN ... #else #define htonll(x)x#endif'這樣的宏中,它變得更有用。因爲那你有可移植的代碼。 – 2012-04-06 14:17:08

1

htonl()需要long而不是double

相關問題