IEEE 754从MIPS C到Java转换的双精度数字

IEEE 754从MIPS C到Java转换的双精度数字,java,c,floating-point,pic,ieee-754,Java,C,Floating Point,Pic,Ieee 754,我有一个运行C32编译器的PIC32嵌入式微控制器。我正在向Java程序发送一个包含64位双精度值的UDP数据包。在我的测试中,我试图将十进制值40.5发送到Java 我希望收到: 0x4044400000000000 自 System.out.println(Double.longBitsToDouble(0x4044400000000000L)) 印刷品: 40.5 如果我发送UDP数据包时未进行任何转换,我将收到: 0x000022242352D3330 知道如何将这个值转换成Java吗?

我有一个运行C32编译器的PIC32嵌入式微控制器。我正在向Java程序发送一个包含64位双精度值的UDP数据包。在我的测试中,我试图将十进制值40.5发送到Java

我希望收到: 0x4044400000000000

自 System.out.println(Double.longBitsToDouble(0x4044400000000000L))

印刷品: 40.5

如果我发送UDP数据包时未进行任何转换,我将收到: 0x000022242352D3330


知道如何将这个值转换成Java吗?我无法确定双精度C32表示法的正反两面。

htonl()
需要
长的
,而不是
双精度PIC32是小端的。双精度的
由64位表示,长的
由32位表示。对于64位,您需要一个
long

htonl()
需要
长的
,如上所述。您将使用强制转换对其进行截断,在endianness转换之后,您将获得显示的结果

我在一本书中发现了这一点;这是一个用于转换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) | \
#定义htonll(x)\
|\
((x)和0x00ff000000000000LL)>>40)|\
((x)和0x0000ff000000000ll)>>24)\
((x)和0x000000ff00000000LL)>>8)\

(((x)和0x00000000ff000000LL)图片上的sizeof(double)实际上是8吗?您如何在double上调用htonl?您如何将其引入java?@Collin是的,sizeof(double)电话号码是8pic32@dbrank0,endianness在MIPS上是小的,在Java中是大的。@Scott,在Java中,我正在转储接收到的原始字节。我尝试使用Double.longBitsToDouble以及DataInputStream.ReadDoubleUsage。因此,htonl正在截断我的一些数据。我还发现了一个我已经消除的结构打包问题。问题是使用我现在发送和接收的实际数据进行更新。+1因为这很有用,可以在java或Pict上运行。如果使用类似于
#if LITTLE#ENDIAN…#else#define htonll(x)的格式包装该宏,它会变得更有用x#endif
。因为这样你就有了可移植的代码。看起来我需要做一些手动打包,以确保发送的号码是IEEE-754。我发现这个网站有pack754_64功能。[链接]。一旦我将它与你的htonll结合起来,我的两端都是0x4044400000000000,两端都是40.5。:)
u64\u t value\u to\u send=htonll(pack754\u 64((双精度)40.5));