DWORD отобразить как float в PHP

*
0
*
✩
У меня есть либо текстовая строка вида "28FFA243", либо четыре байта DWORD с тем же содержимым. Как в PHP превратить их в число или строку формата float?

РЕШЕНИЕ:
Видимо pack и unpack
php flaot hex pack unpack
1 год 1 месяц назад

#ссылка не по теме? tweet сохранить
комментировать



*
0
*
1. В PHP нет "строки формата float". Есть либо число с плавающей точкой (тип float), либо строка (тип string). Дальше уже от ситуации есть "прозрачное" преобразование типов, но это совершенно другая история.

2. насколько я понял, вы храните IP-адреса в виде DWORD? Если так, то это вам должно помочь. Подсмотрено где-то:
function hex2ip($hex) {
  $ip='';
  do {
    $ip.=hexdec(substr($hex,0,2)).".";
    $hex = substr($hex,2,strlen($hex));
  } while(strlen($hex) > 0);
  return substr($ip,0,(strlen($ip)-1));
}


3. Что еще? В общем-то, если вы храните все в MySQL или другой СуБД - то вы в любом случае получаете строки при запросах.
#ссылка не по теме?
1 год 1 месяц назад
smart
[169]
В том то и дело, что во всем PHP нигде не указан тип переменной и приведение типов - считай единственный способ хоть в этом месте кода быть уверенным, что вы используете именно тот тип, который вам необзодим. Есть еще всякие проверки типа is_int, is_float и пр., но десятичную точку во float вам никто не покажет. А вообще: define("LENGTH", 32); define("SIGN_BIT", 31); define("EXPONENT_MSB", 30); define("EXPONENT_LSB", 23); define("MANTISSA_MSB", 22); define("MANTISSA_LSB", 0); function hex2float($strHex) { $dec = hexdec($strHex); $sign = ($dec & (1 << SIGN_BIT)) != 0; $exp = (($dec & ((2 << EXPONENT_MSB) - (1 << EXPONENT_LSB))) >> EXPONENT_LSB) - (1 << (EXPONENT_MSB - EXPONENT_LSB)) - (MANTISSA_MSB - MANTISSA_LSB); $man = (($dec & ((2 << MANTISSA_MSB) - (1 << MANTISSA_LSB))) >> MANTISSA_LSB) + (2 << (MANTISSA_MSB - MANTISSA_LSB)); $float = floatval($man * pow(2, $exp) * ($sign ? -1 : 1)); } – smart 1 год 1 месяц назад
Вот что-то такое нашел: http://www.phpclasses.org/browse/package/2454.html – sprava 1 год 1 месяц назад
Нашел ответ, почему-то вчера туда не добрался: http://theserverpages.com/php/manual/en/language.types.float.php <? // $bin must be 4 bytes, MSB first (Most Significant Byte) function bin2float ($bin) { $float = (float) 0; // Read Exponent and Sign (+/-) $exponent = ord ($bin{3}); if ($sign = $exponent & 128) $exponent -= 128; $exponent <<= 1; // Read the remaining bit for Exponent and loop through Mantissa, calculating the Fraction $fraction = (float) 1; $div = 1; for ($x=2; $x>=0; $x--) { $byte = ord ($bin{$x}); for ($y=7; $y>=0; $y--) { if ($x==2 && $y==7) { if ($byte & (1 << $y)) $exponent += 1; } else { $div *= 0.5; if ($byte & (1 << $y)) $fraction += $div; } } } // 0 value check if (!$exponent && $fraction == 1) return 0; // Final calc, returning the converted float $exponent -= 127; $float = pow (2, $exponent) * $fraction; if ($sign) $float = -($float); return $float; } echo bin2float (chr (0xb1).chr (0x5c).chr (0xbc).chr (0x41))."\n"; echo bin2float (chr (0x00).chr (0x18).chr (0x5c).chr (0x3f))."\n"; echo bin2float (chr (0).chr (0).chr (160).chr (193))."\n"; echo bin2float (chr (0).chr (0).chr (0).chr (0)); ?> – sprava 1 год 1 месяц назад
В принципе - оба примера подобны. Я, значит, с самого начала плохо вкурил, что именно нужно. – smart 1 год 1 месяц назад
ага, похожи, только ваш вариант что-то незнакомое выдает... добавил в конце функции return $float; вызываю echo hex2float ("B7C69A44"); а получается что-то не то – sprava 1 год 1 месяц назад
Комментировать

Ваш Ответ:


Ваш OpenID


Получить OpenID

Что такое OpenID?
или

Логин

Email

Пароль


Будет создана учетная запись и на email выслано письмо подтверждения.


новые ответы

Первый раз на сайте?

askdev.ru — это социальный сайт вопросов и ответов для IT-специалистов: программистов, веб-дизайнеров, системных администраторов.
о сайте » регистрация »

Показан

570 раз

Задан

1 год 1 месяц назад

Теги
php x 381
flaot x 2
hex x 3
pack x 2
unpack x 2
X

Пожалуйста, войдите:


Имя:
Пароль:
регистрация
Или используйте OpenID