Ваша проблема в том, что вы интерпретируете значение в порядке байтов с прямым порядком байтов. Это дает вам неправильное значение 6.4
, которое на самом деле -6.3320110435437E-23
. Кроме того, вы распаковываете это как поплавок двойной точности. Это не. Это одинарная точность (всего 4 байта в ширину).
function hex2float($strHex) {
$hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
$bin = implode('', array_map('chr', $hex));
$array = unpack("Gnum", $bin);
return $array['num'];
}
$float = hex2float('4019999a');
echo $float;
Это дает вам правильное значение 2,4.
Более простой способ сделать это - var_dump(unpack('G', hex2bin('4019999a'))[1]);
, который также дает вам правильное значение.