2015-12-28 8 views
7

Possiedo quello che penso sia un IEEE754 con precisione singola o doppia (non sicuro) e mi piacerebbe convertirlo in decimale su PHP.Converti IEEE 754 in virgola mobile decimale

Dato 4 valore esadecimale (che potrebbe essere nel formato little endian, quindi in pratica in ordine inverso) 4A,5B,1B,05 Ho bisogno di convertirlo in un valore decimale che so sarà molto vicino a 4724.50073.

Ho provato alcuni convertitori online ma sono lontani dal risultato previsto, quindi mi manca chiaramente qualcosa.

Se mi echo 0x4A; ricevo 74 e gli altri sono 91, 27 e 5. Non sai da dove partire da qui ...

+0

qual è il dato esatto che hai? – cmorrissey

+0

@cmorrissey Si suppone che siano coordinate GPS, la descrizione nei documenti dice "Tutti i valori in virgola mobile vengono trasmessi in IEEE754 precisione singola o doppia", quindi ottengo questi valori esatti "4A, 5B, 1B, 05" che io conosco è '4724.50073', non sono sicuro di come arrivarci. – matt

+1

Sei sicuro della corrispondenza tra i valori esadecimali e il valore decimale che dai? Vedo che nella rappresentazione binaria di 4724.50073 ci sono tre cifre consecutive di 1, non importa se si prendono i decimali dopo il punto o meno. E non c'è nessuna sequenza di cifre binarie nei numeri esadecimali, non importa come li ordinate. – trincot

risposta

1

Per convertirlo in float, utilizzare unpack. Se l'ordine dei byte non è corretto, dovrai prima annullarlo prima di decomprimerlo. 4 byte (32 bit) di solito significa che è un float, 8 per il doppio.

$bin = "\x4A\x5B\x1B\x05"; 
$a = unpack('f', strrev($bin)); 
echo $a[1]; // 3589825.25 

non vedo alcun modo come questo associa a 4724.50073 direttamente tho. Senza ulteriori dati di test o manuali del produttore, questa domanda non è pienamente rispondente.

Speculazione: a giudicare dalle dimensioni della coordinata è probabilmente una sorta di proiezione (XYZ o mercator) che può quindi essere convertita in WGS84 o qualsiasi altra cosa sia necessaria. Sfortunatamente non c'è modo di verificare poiché non hai fornito sia la latitudine sia la longitudine.

Problemi correlati