32ビットシステムで16進文字列としてエンコードされた64ビット整数を10進文字列に変換する簡単な方法は何ですか。完全な値である必要があります。科学的記数法や切り捨てはできません:/
"0c80000000000063" == "900719925474099299"
"0c80000000000063"!= 9.007199254741E + 17
PHPのbase_convert()とhexdec()は正しく機能しません。
32ビットシステムで16進文字列としてエンコードされた64ビット整数を10進文字列に変換する簡単な方法は何ですか。完全な値である必要があります。科学的記数法や切り捨てはできません:/
"0c80000000000063" == "900719925474099299"
"0c80000000000063"!= 9.007199254741E + 17
PHPのbase_convert()とhexdec()は正しく機能しません。
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
*/
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"
// .....................................
?>