Преобразование шестнадцатеричного в 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. Может кто-нибудь помочь мне?

 3
php
Author: miguelex, 2018-10-15

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>";

?>

Вы можете увидеть его с его размерностью здесь.

 3
Author: David Leonardo Molina Ruiz Dav, 2018-10-15 14:17:10