我有一个运行C32编译器的PIC32嵌入式微控制器。我正在向Java程序发送一个包含64位double值的UDP数据包。在我的测试中,我正在尝试将十进制值40.5发送到Java。
我希望收到: 0x4044400000000000
自 的System.out.println(Double.longBitsToDouble(0x4044400000000000L));
打印: 40.5
如果我发送UDP数据包而没有任何转换,我收到: 0x00002242352D3330
我知道如何将这个价值转化为Java吗?我无法做出双重C32表示的正面或反面。
答案 0 :(得分:2)
PIC32是小端。 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) | \
答案 1 :(得分:1)
htonl()
需要long
,而不是double
。