Ich kenne keinen guten Weg. Es kann sicherlich auf die harte Art und Weise durchgeführt werden, hier ist ein einfache Genauigkeit Beispiel vollständig in JavaScript:
js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0/Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
18.899999618530273
Eine Produktion Implementierung in Betracht ziehen sollte, dass die meisten Felder magische Werte, typischerweise implementiert durch eine spezielle Auslegung für die Angabe, was wäre der größte oder kleinste gewesen. So, erkennen NaN
s und Unendlichkeiten. Das obige Beispiel sollte nach Negativen suchen. (a & 0x80000000)
Update: Ok, ich habe es auch für Doppelgänger. Sie können die obige Technik nicht direkt erweitern, da die interne JS-Repräsentation ein Double ist, und nach ihrer Definition kann sie bestenfalls eine Bit-Zeichenfolge der Länge 52 verarbeiten und sie kann sich nicht um mehr als 32 verschieben.
Ok, doppelt zu tun Sie zuerst hacken als Zeichenfolge die niedrigen 8 Ziffern oder 32 Bits; Verarbeite sie mit einem separaten Objekt. Dann:
js> a = 0x40725082
1081233538
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js>
Ich behielt das obige Beispiel, weil es vom OP ist. Ein härterer Fall ist, wenn die niedrigen 32 Bits einen Wert haben. Hier ist die Umwandlung von 0x40725082deadbeef, ein Full-Präzision double:
js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2,52-32) * Math.pow(2, e) +
b * 1.0/Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js>
Es gibt einige offensichtliche Unterausdrücke Sie ausklammern können, aber ich habe es so gelassen, so kann man sehen, wie es auf das Format betrifft.
Persönlich würde ich beginnen, indem Sie den Hex-Wert mit einem Regex in die einzelnen Stücke zerhacken. Dann würde ich diese als ganze Zahlen bewerten, und schließlich würde ich versuchen, sie wieder in einen Float zu verwandeln. Das scheint etwas zu sein, das schwierig wird, weil Sie es so machen müssen, dass die Javascript-Laufzeit keine Bits auf dem Weg verliert. – Pointy
Für eine maximale Portabilität sollten Sie berücksichtigen, dass IEEE-754-Double entweder Big-Endian oder Little-Endian sein kann. Wenn Sie wissen, welche Konvention von der Hexadezimaleingabe verwendet wird, sollte eine clientseitige Lösung mit pow() portabel sein. Wenn Sie sich dazu entschließen, einen Typ-Punning-Ansatz zu verwenden, müßte zuerst die Client-Plattform-Endianz für Doubles geprüft werden. –
@ Jim Lewis: Ich habe eine Flagge, die mir große oder kleine Endian sagt. – Nosredna