2015-12-28 24 views
7

Mam to, co myślę, że jest to IEEE754 z pojedynczą lub podwójną precyzją (nie jestem pewien) i chciałbym przekonwertować go na dziesiętny w PHP.Konwertuj IEEE 754 na dziesiętny zmiennoprzecinkowy

Biorąc pod uwagę 4 wartości szesnastkowe (które mogą być w małym formacie endian, więc w zasadzie odwrócone zamówienie) 4A,5B,1B,05 Muszę przekonwertować go do wartości dziesiętnej, które wiem, że będzie bardzo blisko 4724.50073.

Próbowałem już konwerterów internetowych, ale są one dalekie od oczekiwanych rezultatów, więc wyraźnie czegoś brakuje.

Jeśli echo 0x4A; ja mam 74 i inni są 91, 27 i 5. Nie wiesz, gdzie go stąd zabrać ...

+0

jakie są dokładnie dane, które posiadasz? – cmorrissey

+0

@cmorrissey Mają one być współrzędnymi GPS, opis w dokumentach mówi: "Wszystkie wartości zmiennoprzecinkowe są przesyłane w IEEE754 pojedynczej lub podwójnej precyzji", wtedy otrzymuję te dokładne wartości '4A, 5B, 1B, 05' które znam to '4724.50073', tylko nie wiesz jak się tam dostać. – matt

+1

Czy jesteś pewny co do zgodności wartości szesnastkowych i wartości dziesiętnej, którą podajesz? Widzę, że w reprezentacji binarnej 4724.50073 są trzy kolejne 1 cyfry, bez względu na to, czy bierzesz dziesiętne po punkcie, czy nie. I nie ma takiej sekwencji cyfr binarnych w liczbach heksadecymalnych, bez względu na to, jak je zamówisz. – trincot

Odpowiedz

1

Aby przekonwertować go na wartość zmiennoprzecinkową, użyj unpack. Jeśli kolejność bajtów jest niepoprawna, przed rozpakowaniem musisz ją odwrócić. 4 bajty (32 bity) zwykle oznaczają, że jest to float, a 8 double.

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

nie widzę żadnego sposobu jak ten mapuje 4724.50073 bezpośrednio tho. Bez dalszych danych testowych lub podręcznika producenta to pytanie nie jest w pełni odpowiedzialne.

Spekulacja: sądząc po rozmiarze współrzędnych, jest to prawdopodobnie projekcja (XYZ lub mercator), którą można następnie przekonwertować na WGS84 lub cokolwiek, czego potrzebujesz. Niestety nie ma możliwości sprawdzenia, ponieważ nie podano zarówno szerokości, jak i długości geograficznej.

Powiązane problemy