首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 進制轉換函數全家桶:bindec/decbin/dechex/decoct/hexdec/octdec/base_convert 詳解與避坑

     編輯:PHP 綜合知識

函數速查表

函數轉換方向參數類型返回類型說明
bindec()二進制 → 十進制stringint/float輸入字符串,如 "1010" → 10
decbin()十進制 → 二進制intstring10 → "1010"
dechex()十進制 → 十六進制intstring255 → "ff"(小寫)
decoct()十進制 → 八進制intstring10 → "12"
hexdec()十六進制 → 十進制stringint/float"ff" → 255,忽略 "0x" 前綴
octdec()八進制 → 十進制stringint/float"12" → 10
base_convert()任意進制互轉 (2-36)string, int, intstringbase_convert('ff', 16, 2) → "11111111"

核心示例

<?php
// 基礎互轉
echo "bindec('1010'): " . bindec('1010') . "\n";      // 10
echo "decbin(10): " . decbin(10) . "\n";              // 1010
echo "dechex(255): " . dechex(255) . "\n";            // ff
echo "decoct(10): " . decoct(10) . "\n";              // 12
echo "hexdec('ff'): " . hexdec('ff') . "\n";          // 255
echo "octdec('12'): " . octdec('12') . "\n";          // 10

// base_convert 萬金油
echo "base_convert('1010', 2, 16): " . base_convert('1010', 2, 16) . "\n"; // a
echo "base_convert('zz', 36, 10): " . base_convert('zz', 36, 10) . "\n";   // 1295 (36進制最大 z=35)

// 大整數注意:PHP int 範圍外自動轉 float,可能失去精度
$big = '111111111111111111111111111111111111111111111111111111111111111'; // 63位
echo "bindec big: " . bindec($big) . "\n"; // 9.2233720368548E+18 (float)
// 解決:使用 GMP/BCMath
echo "gmp_strval(gmp_init($big, 2), 10): " . gmp_strval(gmp_init($big, 2), 10) . "\n"; // 精確整數字符串
?>

避坑指南

坑點現象解決
大整數精度丟失超過 PHP_INT_MAX (64位約 9e18) 返回 float 科學計數法用 gmp_* 或 bcmath 函數族,返回精確字符串
負數處理decbin(-10) 返回補碼形式字符串(如 64位全 1)若需數學負數表示,自行處理符號位
base_convert 精度限制內部經過十進制中轉,大數同樣丟失精度大數進制轉換用 GMP: gmp_strval(gmp_init($num, $fromBase), $toBase)
hexdec 忽略非法字符hexdec('0xFF') 正常,但 hexdec('GG') 返回 0 而非報錯預驗證:ctype_xdigit($str)
前綴混淆PHP 字面量 0b1010、012、0xFF 僅在代碼中有效,函數參數不要帶前綴傳純數字字符串

實際應用場景

1. 權限位掩碼

<?php
const PERM_READ = 0b001;   // 1
const PERM_WRITE = 0b010;  // 2
const PERM_EXEC = 0b100;   // 4

$userPerm = PERM_READ | PERM_WRITE; // 3 (0b011)
if ($userPerm & PERM_READ) echo "可讀\n";
if (!($userPerm & PERM_EXEC)) echo "不可執行\n";

// 存入數據庫:存十進制整數 3
// 顯示:decbin($row['perm']) → "11"
?>

2. 顏色值轉換

<?php
function hexToRgb(string $hex): array {
    $hex = ltrim($hex, '#');
    if (strlen($hex) === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; // #fff → #ffffff
    return [
        'r' => hexdec($hex[0].$hex[1]),
        'g' => hexdec($hex[2].$hex[3]),
        'b' => hexdec($hex[4].$hex[5]),
    ];
}

function rgbToHex(int $r, int $g, int $b): string {
    return '#' . str_pad(dechex($r), 2, '0', STR_PAD_LEFT)
              . str_pad(dechex($g), 2, '0', STR_PAD_LEFT)
              . str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
}

print_r(hexToRgb('#3a7'));   // r=51, g=170, b=119
echo rgbToHex(51, 170, 119); // #33aaff
?>

3. 短網址/ID 混淆 (Base62)

<?php
const BASE62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

function toBase62(int $num): string {
    if ($num === 0) return '0';
    $result = '';
    while ($num > 0) {
        $result = BASE62[$num % 62] . $result;
        $num = (int)($num / 62);
    }
    return $result;
}

function fromBase62(string $str): int {
    $num = 0;
    foreach (str_split($str) as $char) {
        $num = $num * 62 + strpos(BASE62, $char);
    }
    return $num;
}

echo toBase62(123456789); // "8M0k"
echo fromBase62("8M0k");  // 123456789
?>

總結

PHP 內置進制函數足夠日常中小整數場景。**大整數、高性能、精確科學計算請用 GMP/BCMath**。理解位運算與進制本質,靈活組合解決權限、顏色、編碼、ID 生成等實際問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved