什麼是在64位系統上將64位整數編碼爲十六進制字符串轉換爲十進制字符串的簡單方法。它需要的全部價值,它不能在科學記數法或截短:/在32位系統上將64位整數十六進制字符串轉換爲64位十進制字符串
「0c80000000000063」 == 「900719925474099299」
「0c80000000000063」= 9.007199254741E + 17
PHP的base_convert ()和hexdec()不能完成這項工作。
什麼是在64位系統上將64位整數編碼爲十六進制字符串轉換爲十進制字符串的簡單方法。它需要的全部價值,它不能在科學記數法或截短:/在32位系統上將64位整數十六進制字符串轉換爲64位十進制字符串
「0c80000000000063」 == 「900719925474099299」
「0c80000000000063」= 9.007199254741E + 17
PHP的base_convert ()和hexdec()不能完成這項工作。
您需要使用BC Math PHP擴展(捆綁)。
先拆你的輸入字符串,以獲得高和低字節,接下來的將其轉換爲十進制數,然後通過類似這樣的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幫助頁面的第一條評論?
當給出大量數字時,十六進制功能自動將該值轉換爲科學記數法的值爲 。因此,「aa1233123124121241」作爲 的十六進制值將被轉換爲「3.13725790445E + 21」。如果你是 轉換表示散列值的十六進制值(md5或 sha),那麼你需要該表示的每一位使其 有用。通過使用number_format函數,您可以完美地完成這項工作。例如:
<?php
// Author: [email protected]
// 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"
// .....................................
?>
這是行不通的。它只是擴展它。 0c80000000000062!= 900719925474099328 – 2012-08-08 15:44:16
嗯,由一個? – favoretti 2012-08-08 15:46:56
這是錯誤的,number_format將使用舍入數字。 0x1234567890abcdef1234567890abcdef == 24197857200151252728969465429440056815(base 10) – 2014-02-20 15:50:13