48 Stimmen

Hex in Float umwandeln

Wie konvertiert man die folgende Hex-Zeichenkette in Python in Float (einfache Genauigkeit 32-Bit)?

"41973333" -> 1.88999996185302734375E1

"41995C29" -> 1.91700000762939453125E1

"470FC614" -> 3.6806078125E4

-1voto

Tcll Punkte 6748

Meine Damen und Herren... Seht her:

    class fl:
        def __init__(this, value=0, byte_size=4):

            this.value = value

            if this.value: # speedy check (before performing any calculations)
                Fe=((byte_size*8)-1)//(byte_size+1)+(byte_size>2)*byte_size//2+(byte_size==3)
                Fm,Fb,Fie=(((byte_size*8)-(1+Fe)), ~(~0<<Fe-1), (1<<Fe)-1)

                FS,FE,FM=((this.value>>((byte_size*8)-1))&1,(this.value>>Fm)&Fie,this.value&~(~0 << Fm))
                if FE == Fie: this.value=(float('NaN') if FM!=0 else (float('+inf') if FS else float('-inf')))
                else: this.value=((pow(-1,FS)*(2**(FE-Fb-Fm)*((1<<Fm)+FM))) if FE else pow(-1,FS)*(2**(1-Fb-Fm)*FM))

                del Fe; del Fm; del Fb; del Fie; del FS; del FE; del FM

            else: this.value = 0.0

    print fl( 0x41973333 ).value # >>> 18.899999618530273
    print fl( 0x41995C29 ).value # >>> 19.170000076293945
    print fl( 0x470FC614 ).value # >>> 36806.078125
    print fl( 0x00800000 ).value # >>> 1.1754943508222875e-38 (minimum float value)
    print fl( 0x7F7FFFFF ).value # >>> 340282346638528859811704183484516925440L (maximum float value)
    # looks like I've found a small bug o.o
    # the code still works though (the numbers are properly formatted)
    # the result SHOULD be: 3.4028234663852886e+38 (rounded)
    print fl( 0x3f80000000, 5 ).value # >>> 1.0

Entschuldigung für das kleine ".value" am Ende...
Dieser Code wird seit fast 2 Jahren als Klasse in meinem Programm verwendet.
(mit ein wenig Bearbeitung können Sie daraus leicht eine Funktion machen)

Dank an PyTony drüben bei DaniWeb für den Code.

im Gegensatz zum nicht-dynamischen Rechnen,
der Code ist nicht fest auf eine feste Float-Größe verdrahtet,
und funktioniert mit jeder Byte-Größe.

Allerdings müssen wir wohl noch ein paar Fehler beseitigen. XDD
(Ich werde diesen Code später (wenn ich kann) mit dem Update bearbeiten)

Aber im Moment ist noch alles gut...
Ich hatte bisher keine Probleme, 3D-Spielemodelle damit zu konvertieren :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X