4

32ビットシステムで16進文字列としてエンコードされた64ビット整数を10進文字列に変換する簡単な方法は何ですか。完全な値である必要があります。科学的記数法や切り捨てはできません:/

"0c80000000000063" == "900719925474099299"

"0c80000000000063"!= 9.007199254741E + 17

PHPのbase_convert()とhexdec()は正しく機能しません。

4

2 に答える 2

2

BC Math PHP拡張機能(バンドル)を使用する必要があります。

最初に入力文字列を分割して上位バイトと下位バイトを取得し、次にそれを10進数に変換してから、次のようなBC関数を介して計算を実行します。

$input = "0C80000000000063";

$str_high = substr($input, 0, 8);
$str_low = substr($input, 8, 8);

$dec_high = hexdec($str_high);
$dec_low  = hexdec($str_low);

//workaround for argument 0x100000000
$temp = bcmul ($dec_high, 0xffffffff);
$temp2 = bcadd ($temp, $dec_high);

$result = bcadd ($temp2, $dec_low);

echo $result;

/*
900719925474099299
*/
于 2012-08-12T02:22:25.670 に答える
1

php.netのhexdecのヘルプページへの最初のコメントを見たことがありますか?

大きな数値が与えられると、hexdec関数は値を科学的記数法に自動的に変換します。したがって、16進値としての「aa1233123124121241」は「3.13725790445E+21」に変換されます。ハッシュ値(md5またはsha)を表す16進値を変換する場合、それを有用にするために、その表現のすべてのビットが必要です。number_format関数を使用することにより、それを完全に行うことができます。例えば ​​:

<?php

            // Author: holdoffhunger@gmail.com

        // Example Hexadecimal
        // ---------------------------------------------

    $hexadecimal_string = "1234567890abcdef1234567890abcdef";

        // Converted to Decimal
        // ---------------------------------------------

    $decimal_result = hexdec($hexadecimal_string);

        // Print Pre-Formatted Results
        // ---------------------------------------------

    print($decimal_result);

            // Output Here: "2.41978572002E+37"
            // .....................................

        // Format Results to View Whole All Digits in Integer
        // ---------------------------------------------

            // ( Note: All fractional value of the
            //         Hexadecimal variable are ignored
            //         in the conversion. )

    $current_hashing_algorithm_decimal_result = number_format($decimal_result, 0, '', '');

        // Print Formatted Results
        // ---------------------------------------------

    print($current_hashing_algorithm_decimal_result);

            // Output Here: "24197857200151253041252346215207534592"
            // .....................................

?>
于 2012-08-08T15:38:59.823 に答える