Преобразование шестнадцатеричного в float
я работаю с php, и я получаю координаты в шестнадцатеричном формате (это не может быть изменено, потому что это сообщение, полученное из сети SigFox). Полученные значения: C40B3986
и 4564AF79
, а значения в float будут -556.8988
и 3658.967
. Я использовал этот код, который я нашел google, чтобы сделать преобразование:
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'];
}
но полученные результаты сильно отличаются от ожидаемых: 2.9704245515207E-65
и 6.7994010560009E-225
. Может кто-нибудь помочь мне?
1 answers
Вот функция, которая может вам помочь:
<?php
$string = "C40B3986";
function hexTo32Float($strHex) {
$v = hexdec($strHex);
$x = ($v & ((1 << 23) - 1)) + (1 << 23) * ($v >> 31 | 1);
$exp = ($v >> 23 & 0xFF) - 127;
return $x * pow(2, $exp - 23);
}
$float = hexTo32Float($string);
echo "El valor Float de ".$string." es: ".$float."<br>";
?>
Эта функция преобразует шестнадцатеричную строку в 32-битное плавающее число IEEE 754.
Вы можете увидеть, как он работает здесь:
Отредактировано
В соответствии с размером @aloMalbarez:
Похоже, что бит знака съеден, поэтому вы должны добавить его
Будет выглядеть так:
<?php
$string = "C40B3986";
function hexTo32Float($strHex) {
$v = hexdec($strHex);
$x = ($v & ((1 << 23) - 1)) + (1 << 23) * ($v >> 31 | 1);
$exp = ($v >> 23 & 0xFF) - 127;
return $x * pow(2, $exp - 23)*($v>>31==0?1:-1);
}
$float = hexTo32Float($string);
echo "El valor Float de ".$string." es: ".$float."<br>";
?>
Вы можете увидеть его с его размерностью здесь.