2012-04-06 10 views
1

Ich habe einen eingebetteten PIC32-Mikrocontroller, der den C32-Compiler ausführt. Ich sende ein UDP-Paket mit einem 64-Bit-Doppelwert an ein Java-Programm. In meinem Test versuche ich den Dezimalwert 40.5 nach Java zu senden.IEEE 754 Zahlen mit doppelter Genauigkeit von MIPS C zu Java-Konvertierung

würde ich erhalten erwarten: 0x4044400000000000

seit System.out.println (Double.longBitsToDouble (0x4044400000000000L));

druckt: 40,5

Wenn ich das UDP-Paket ohne Konvertierungen senden, Ich erhalte: 0x00002242352D3330

Jede Idee, wie ich diesen Wert in Java bekommen? Ich kann die C32-Repräsentation des Doppelkopfs weder Kopf noch Zahl machen.

+2

Ist endianess gleich? – dbrank0

+0

Ist sizeof (double) eigentlich 8 auf dem PIC? Wie nennt man Htonl auf dem Doppel? – Collin

+0

Wie ziehst du das in Java ein? –

Antwort

2

Die PIC32 ist Little Endian. A double wird durch 64 Bits repräsentiert, und long ist 32 Bits. Für 64 Bits benötigen Sie eine long long.

htonl() dauert eine long, wie oben erwähnt. Sie schneiden es mit dem Cast ab, und nach der Endianness-Konvertierung erhalten Sie die angezeigten Ergebnisse.

Ich fand dies in einem pastebin; es ist Makro, das für die Umwandlung Ihrer 64 Bit funktionieren sollte 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

nützlich zu verwenden. htonl schneidet also einige meiner Daten ab. Ich habe auch ein Struct Packing-Problem gefunden, das ich ebenfalls eliminiert habe. Die Frage wurde mit den tatsächlichen Daten aktualisiert, die ich jetzt sende und jetzt empfange. –

+0

+1, da dies nützlich ist und in Java oder auf dem PIC –

+1

ausgeführt werden könnte Dieses Makro wird nützlicher, wenn es in etwas wie "#if LITTLE_ENDIAN ... #else #define htonll (x) x # endif" eingewickelt ist. Denn dann hast du tragbaren Code. –

1

htonl() dauert ein long, kein double.

Verwandte Themen