Double-Wert aus einem HexString erstellen.

Status
Nicht offen für weitere Antworten.

Berto

Mitglied
Hallo,
ich habe einen Hexadezimalstring eines Doubles.
Z.B.:
Code:
9B690C84AE8EB93F
Jetzt möchte ich diesen in einen Double-Wert umwandeln. Die einzelnen HexZahlen sind dabei die Bytes des Doubles.
Jemand ne Ahnung wie das geht? Ich bin mit meinem gerade anfangendem Latein auch schonwieder am Ende...
 

foobar

Top Contributor
Guckst du hier
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#decode(java.lang.String)
 
B

Beni

Gast
Wandle das Ding zuerst in einen Long um (Long.decode), und wandle den Long anschliessend in einen Double um (Double.longBitsToDouble).
 

Berto

Mitglied
Hallo, ich hab jetzt lange probiert, und auch ein extra Testprogramm gemacht. Irgendwas klappt da nicht...
Code:
String t = "0x000000000000F03F"; // ist 1.0
g.drawString(t, 5, 30);
long h = Long.decode(t);
g.drawString(Long.toString(h), 5, 40);
double m = Double.longBitsToDouble(h);
g.drawString(Double.toString(m), 5, 50);
Bei der Ausgabe kommt dann sowas raus:
Code:
0x000000000000F03F
61503
3.03865E-319
Ich weis nicht was ich falsch gemacht habe, aber so funktioniert es nicht. Ich habe den Doublewert mehrfach geprüft, er ist 1.0 wenn man ihn richtig "übersetzt".

Ich bin mir nicht hundert-prozentig sicher ob das "0x" davor stimmt, aber wenn ich das nicht hinschreibe, dann macht er einen Fehler, weil er wenn das erste Zeichen eine Null ist, die selbige weglässt.
 

hugo

Bekanntes Mitglied
Also laut Rechner ist die Umwandlung von deiner Hexadezimalzahl in den int-Wert richtig.
aus "F03F" wird 61503.
 

kopfsalat

Bekanntes Mitglied
Double-1.0 sollte eigentlich
0011111111110000000000000000000000000000000000000000000000000000
so aussehen.
Also Vorzeichen 0 = plus
Exponent 01111111111 = 1023, also 1023 - 1023 = 0, also 2^0 = 1
Mantisse die restlichen Nullen (zzgl. Hidden Bit).
Also "wert = (+)1 * 2^0 = 1.0"

Der Wert 0xF03F ist aber long:
0000000000000000000000000000000000000000000000001111000000111111
Demnach Vorzeichen 0 = plus
Exponent 0 = 0, also 0 - 1023 = 2^(-1023), bzw. hier (da alle 0) "smallest subnormal" (also ohne hidden Bit), also 2^(-1075) = 2.5 x 10^(-324)
Mantisse 1111000000111111. Hat 16 Stellen, also irgendein Wert so grob um 2^(-1056) herum, also etwas um 1.3 x 10^(-318). Das Ergebnis scheint also durchaus korrekt zu sein.
Also "wert = (+)Mantisse * 10^(-318)"

Suche für das Double-Format mal nach "IEEE Floating Point Standard"
 

Berto

Mitglied
Ok, kopfsalat, das verwirrt mich jetzt schon ein kleines bisschen.
Aber von dem Teil, den ich meine verstanden zu haben kann ich sagen:
Ich hab den Double einfach von Delphi in eine Datei schreiben lassen (Double is ja überall gleich nach IEEE). Und dann hab ichs mir im HexEditor angeschaut. Dabei kam dieser HexString halt für 1.0 raus. Der HexEditor hat auch eine Funktion wo man acht markierte Bytes als Double anzeigen kann, und der meinte ebenfalls, es wäre 1.0!
Also müsste der doch theoretisch stimmen.
Und was bringt es mir jetzt nach dem Standard zu suchen, also dann nen eigenen Parser oso zu schreiben schaff ich net, auch wenn ich dann weis wie ein double aufgebaut ist.

Edit:
Ich hab das gerade mal nachgeschaut zu meintest:
Double-1.0 sollte eigentlich
0011111111110000000000000000000000000000000000000000000000000000

Wenn du jetzt mal schaust ergibt sich folgendes:
Code:
00111111 = 63  = 3F
11110000 = 240 = F0
00000000 = 0   = 00
00000000 = 0   = 00
00000000 = 0   = 00
00000000 = 0   = 00
00000000 = 0   = 00
00000000 = 0   = 00
D.h. deine Bits als HexString entsprechen meinem "000000000000F03F".

Edit2:
Achso, hm du scheinst das auf die verschiedenen Bits von double und long zu beziehen und, dass die dann einfach so übertragen werden. Also liegt das Problem darin, dass der long das 0xF03F als Zahl betrachtet und nicht das 000000000000F03F als String aus dem er seine einzelnen Bits auslesen soll.
 

kopfsalat

Bekanntes Mitglied
Ajo! Gut, dass dir das noch aufgefallen ist!
Dann liegt hier eine Ausuferung des "Big Endian" <-> "Little Endian" Problems vor:
Was das ist ? Siehe dazu hier:

http://de.wikipedia.org/wiki/Big_Endian

Diese blöde Unstandardisiertheit schlägt in den blödesten Situationen zurück. Da kannst Du nichts gegen machen, als entweder die Zahlen von vorneherein gleichartig zu speichern, oder aber die Bytes zunächst neu zusammenzusetzen, z.B. so:

Code:
class BigLittleEndian
{
    public static void main (String [] args)
    {
        Long val = Long.parseLong("1122334455667788", 16);
        System.out.println("Big Endian : " + Long.toHexString(val));
        val = Long.reverseBytes(val);
        System.out.println("Little Endian : " + Long.toHexString(val));
    }
}
 

Berto

Mitglied
Hm und wo is jetzt das Problem. Auch wenn die Bits verkehrtrum wären is doch trotzdem das Problem, dass er den HexString als Zahl und nicht als Bitwerte für den long sieht...
[schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Hmpf![/schild]
 

kopfsalat

Bekanntes Mitglied
Hm und wo is jetzt das Problem. Auch wenn die Bits verkehrtrum wären is doch trotzdem das Problem, dass er den HexString als Zahl und nicht als Bitwerte für den long sieht...
???
Sobald der HexString als Zahl gesehen wird, sind es doch gleich Bitwerte für einen Long. Jede Zahl wird doch in Bits gespeichert, nur für die Anzeige kann man die schön in Dezimal oder Hexadezimal, etc. anzeigen lassen.

Wahrscheinlich speichert Dein Delphi-Programm im Little-Endian-Format, d.h. ein 8-Byte-Wert (ob Long, oder Double ist wurscht) der Form "0x1122334455667788") wird in die Datei geschrieben als 88 77 66 55 44 33 22 11. Deswegen wird aus 1.0, was in Hex-Repräsentation heißt : 0x3FF0000000000000, gespeichert als 00 00 00 00 00 00 F0 3F. Dein Hex-Viewer wird das wohl als Little-Endian-Double interpretiert gleich entsprechend umrechnen.
Die IEEE-Norm legt nicht fest, ob Little- oder Big-Endian genutzt werden soll.

Du musst, solltest Du also die 8 Bytes in der Reihenfolge einlesen, die wieder umdrehen, dazu gibt es die reverseBytes - Methode.

Du liest also die Zahl wie in deinem eigenen Beispiel ein, wandelst sie in einen long mit "long h = Long.decode(t);" Direkt danach rufst Du "h = Long.reverseBytes(h);" auf, um die 8 Bytes umzudrehen, um dann mit "double m = Double.longBitsToDouble(h);" dieselben Bits als double-Wert zu interpretieren.
 

Berto

Mitglied
Stimmt, das mit den Bytes war nen Denkfehler von mir.

Du hattest recht, es liegt an dem Little/Big Endian Problem. Habe die Methode angewandt und jetzt funktioniert es.

Ich danke dir.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
J String mit "," in Double Wert konvertieren Allgemeine Java-Themen 7
G Double Wert über OutputStream verschicken Allgemeine Java-Themen 2
reibi double-Wert auf 2 Stellen nach dem Komma abschneiden Allgemeine Java-Themen 6
Neumi5694 double Vergleich Allgemeine Java-Themen 19
G Modulo - double Allgemeine Java-Themen 21
ReinerCoder Eclipse Fehlermeldung - The constructor Double(double) is deprecated Allgemeine Java-Themen 8
O Variablen Addition von Double-Werten ergibt seltsame 0.9999999 Zahlen Allgemeine Java-Themen 2
B Long in einen Double umwandeln und im Label anzeigen Allgemeine Java-Themen 7
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
B List<Integer> ist List<Double> ? Allgemeine Java-Themen 6
SkyScreamer Variablen Int umwande in Double/ 1 Miner = 5 Cookies/s Allgemeine Java-Themen 2
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
T Double salted bcrypt Allgemeine Java-Themen 0
A Zahl abgerundet obwohl Double Allgemeine Java-Themen 9
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
Y String to Double ohne ParseDouble Allgemeine Java-Themen 11
D Double aus String auslesen Allgemeine Java-Themen 8
M double Array Allgemeine Java-Themen 8
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
C String in double[][] konvertieren! Allgemeine Java-Themen 5
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
Zettelkasten Double --> Integer Allgemeine Java-Themen 4
M float, double, BigDecimal Allgemeine Java-Themen 5
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
B Variablen Bug of Float. & Double.MIN_VALUE! Allgemeine Java-Themen 4
T ArrayList<double[]> persitent anlegen Allgemeine Java-Themen 7
K double Zufallszahl Allgemeine Java-Themen 6
S String in Double - letztes Zeichen fehlt Allgemeine Java-Themen 4
T int <-> integer, double <-> Double... Allgemeine Java-Themen 2
J Umstellung von double auf BigDecimal Allgemeine Java-Themen 5
H2SO3- String 1.000,00 in double umwandeln Allgemeine Java-Themen 12
S Double-Checked Locking Allgemeine Java-Themen 4
I 2D-Grafik Polygon mit Double Werten zeichnen Allgemeine Java-Themen 4
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
vandread Float/Double probleme bei der Multiplikation?! Allgemeine Java-Themen 3
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
F double auf 2 Nachkommastellen runden Allgemeine Java-Themen 9
D Double to Integer - ist das möglich? Allgemeine Java-Themen 3
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
H2SO3- großen double in string mit e umwandeln Allgemeine Java-Themen 4
T Problem: Double als Geldbetrag - Rundungsfehler Allgemeine Java-Themen 5
P große double Zahlen und modulo Allgemeine Java-Themen 8
M größer als double? Allgemeine Java-Themen 4
N Double ohne Wissenschaftliche Schreibweiße Allgemeine Java-Themen 5
M Double Braces Notation um Collections zu initialisieren Allgemeine Java-Themen 9
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
T XStream.toXML => double mit , anstelle . Allgemeine Java-Themen 3
G Fehler bei Array.getDouble mit Double[] als Argument! Allgemeine Java-Themen 6
A Problem bei Übergabe von Werten in ein double Array. Allgemeine Java-Themen 21
M Double immer mit 2 Kommastellen Allgemeine Java-Themen 3
G double in Date Allgemeine Java-Themen 5
G Genauigkeit von Double Allgemeine Java-Themen 2
F Double mit Streams aus Datei einlesen Allgemeine Java-Themen 3
V "double in Exponentialschreibweise" normal ausgebe Allgemeine Java-Themen 2
S List<Double> oder Double[] in double[] zu konvertieren Allgemeine Java-Themen 6
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
E int vs. float vs. double Allgemeine Java-Themen 7
T cast Object to Double[] Allgemeine Java-Themen 2
DEvent double von c nach Java Allgemeine Java-Themen 4
K Double-Zahl runden Allgemeine Java-Themen 4
J double 3.0 soll ohne Nachkommastelle ausgegeben werden Allgemeine Java-Themen 12
S Java Double addieren Allgemeine Java-Themen 3
A string zu double Allgemeine Java-Themen 3
T double to object Allgemeine Java-Themen 3
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
G Verständnisproblem double und float Allgemeine Java-Themen 7
padde479 String in double parsen Allgemeine Java-Themen 6
E double auf int runden, nicht abschneiden Allgemeine Java-Themen 2
G Double Zahl quadrieren Allgemeine Java-Themen 8
C double Zahlen mit drei NachkommaStellen in String umwandeln Allgemeine Java-Themen 2
T Nachkommastellen double Allgemeine Java-Themen 18
M double aufrunden Allgemeine Java-Themen 6
W Division mit float und double Allgemeine Java-Themen 2
D JTextfield für double werte Allgemeine Java-Themen 2
S Format von Double Allgemeine Java-Themen 9
F Umwandlungsproblem mit double Allgemeine Java-Themen 2
S Problem! Lösung mit Double buffering Allgemeine Java-Themen 3
T Vector <-> double Allgemeine Java-Themen 4
W float/double verhält sich seltsam Allgemeine Java-Themen 6
D Double: Grenzen und Darstellung Allgemeine Java-Themen 7
W String to Double (landesspezifisch) Allgemeine Java-Themen 14
T Fließkomma (double) richtig runden Allgemeine Java-Themen 7
P Class zu Integer, String, Double etc. Allgemeine Java-Themen 11
R Fehler in WindowsXP oder Java? - double in int konvertieren Allgemeine Java-Themen 10
E NumberFormatException bei cast auf double Allgemeine Java-Themen 5
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7
G Double Zahl auf 4 Stellen hinter Komma kuerzen Allgemeine Java-Themen 4
G warum operator || cannot be applied to int, double Allgemeine Java-Themen 11
A Probleme Umwandlung Ausdruck String in double Allgemeine Java-Themen 4
R Double Buffering zu langsam Allgemeine Java-Themen 11
C Bug in Java1.4.2_03 mit double Allgemeine Java-Themen 5
H Double mit 2 Nachkommastellen speichern. Allgemeine Java-Themen 5
C Double zu Hex oder Byte Allgemeine Java-Themen 4
J Wie kann man herausfinden, wo der Wert herkommt ? Allgemeine Java-Themen 13
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben