PHP конвертировать гекс в плавающий - PullRequest
2 голосов
/ 15 апреля 2020

Привет. Я пытаюсь преобразовать шестнадцатеричное значение в число с плавающей точкой. Метод, который я использую:

function hex2float($strHex) {
$hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
$hex = array_reverse($hex);
$bin = implode('', array_map('chr', $hex));
$array = unpack("dnum", $bin);
return $array['num'];
}

$float = hex2float('4019999a');
echo $float;

Выход

Выходное значение, которое он возвращает: 6.4000015258789 но на самом деле это должно быть 2.4

См. ссылка

1 Ответ

1 голос
/ 15 апреля 2020

Ваша проблема в том, что вы интерпретируете значение в порядке байтов с прямым порядком байтов. Это дает вам неправильное значение 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]);, который также дает вам правильное значение.

...