trash-area.com ≫ blog ≫ プログラミング ≫ php ≫ IEEE-754形式のバイナリをPHPのfloatに変換する
浮動小数点数がIEEE-754形式(32ビット)の16進文字列を受けて
PHPのfloatにキャストしてreturnするサンプルです。
function bin2float($binstr) { $bits = hexdec($binstr); if ($bits == 0x7f800000) return 9.99e99999999; if ($bits == 0xff800000) return -9.99e99999999; if ((0x7f800001 <= $bits && $bits <= 0x7fffffff) || (0xff800001 <= $bits && $bits <= 0xffffffff)) return acos(2); // NaN $s = (($bits >> 31) == 0) ? 1 : -1; $e = (($bits >> 23) & 0xff); $m = ($e == 0) ? ($bits & 0x7fffff) << 1 : ($bits & 0x7fffff) | 0x800000; return floatval($s * $m * pow(2,$e-150)); } |
いちおう正の無限大とか負の無限大とか NaN とか実装したつもりです。
いまいちこれであってるのか自信ありません。
IEEE-754 Floating-Point Conversionでぽちぽちと試した感じではおおむねだいじょぶかなぁと。
単純な使い方はこんな感じ。
var_dump(bin2float("40200000")); var_dump(bin2float("00000000")); var_dump(is_infinite(bin2float("00000000"))); var_dump(is_infinite(bin2float("7F800000"))); var_dump(is_nan(bin2float("40200000"))); var_dump(is_nan(bin2float("FF900000"))); |
バイナリから使うときはこんな感じ。
$b = unpack("H8", pack("c*", 0x40, 0x20, 0x00, 0x00)); var_dump(bin2float($b[1])); |
こっから追記
packとかいまいちよくわからないので調べてたら驚愕の事実が。
$data = unpack("f", pack("h*", strrev("40200000"))); var_dump($data); |
だからサンプル探してもなかったんですねо
費やした時間がせつなすぎて 。 を о(ろしあ)にしていますо
ここまで追記