函數速查表
| 函數 | 轉換方向 | 參數類型 | 返回類型 | 說明 |
bindec() | 二進制 → 十進制 | string | int/float | 輸入字符串,如 "1010" → 10 |
decbin() | 十進制 → 二進制 | int | string | 10 → "1010" |
dechex() | 十進制 → 十六進制 | int | string | 255 → "ff"(小寫) |
decoct() | 十進制 → 八進制 | int | string | 10 → "12" |
hexdec() | 十六進制 → 十進制 | string | int/float | "ff" → 255,忽略 "0x" 前綴 |
octdec() | 八進制 → 十進制 | string | int/float | "12" → 10 |
base_convert() | 任意進制互轉 (2-36) | string, int, int | string | base_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 生成等實際問題。