2012-04-06 55 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

相关问题