1

16 進数の文字列は次のようになります: 0X1.05P+10

この 16 進数の実際の値は 1044.0 です。

メソッドstrtodを使用してC言語を使用して変換できます。しかし、PHPで変換する方法が見つかりません。誰かがそれを行う方法を教えてもらえますか?

値文字列リスト:

1. "0X1.FAP+9"
2. "0X1.C4P+9"
3. "0X1.F3P+9"
4. "0X1.05P+10"
4

2 に答える 2

0

これにはカスタム関数を作成する必要があると思います。今日は気分がいいので、あなたのためにカスタムメイドしました:

function strtod($hex) {
    preg_match('#([\da-f]+)\.?([\da-f]*)p#i', $hex, $parts);

    $i = 0;
    $fractional_part = array_reduce(str_split($parts[2]), function($sum, $part) use (&$i) {
        $sum += hexdec($part) * pow(16, --$i);

        return $sum;
    });

    $decimal = (hexdec($parts[1]) + $fractional_part) * pow(2, array_pop(explode('+', $hex)));  

    return $decimal;
}

foreach(array('0X1.FAP+9', '0X1.C4P+9', '0X1.F3P+9', '0X1.05P+10', '0X1P+0') as $hex) {
    var_dump(strtod($hex));
};

PHP 5.3 より前のバージョンの場合:

function strtod($hex) {
    preg_match('#([\da-f]+)\.?([\da-f]*)p#i', $hex, $parts);

    $fractional_part = 0;

    foreach(str_split($parts[2]) as $index => $part) {
        $fractional_part += hexdec($part) * pow(16, ($index + 1) * -1);
    }

    $decimal = (hexdec($parts[1]) + $fractional_part) * pow(2, array_pop(explode('+', $hex)));  

    return $decimal;
}

foreach(array('0X1.FAP+9', '0X1.C4P+9', '0X1.F3P+9', '0X1.05P+10', '0X1P+0') as $hex) {
    var_dump(strtod($hex));
};
于 2013-05-21T13:12:16.007 に答える