深度解析進制轉換數學原理,提供不依賴內置函數的純 PHP 實現,適合理解底層邏輯、嵌入式開發、协议解析等場景。
function decToBase($numbers, $base) {
static $map = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'];
!is_array($numbers) && $numbers = [$numbers];
if ($base === 10) return $numbers;
$byteLen = ceil(16 / $base); // 每字節字符數
$results = [];
foreach ($numbers as $num) {
$num = intval($num);
if ($num === 0) { $results[] = str_repeat('0', $byteLen); continue; }
$str = '';
while ($num > 0) {
$str = $map[$num % $base] . $str;
$num = intdiv($num, $base);
}
// 不足字節長度左補零
$pad = $byteLen - (strlen($str) % $byteLen);
if ($pad !== $byteLen) $str = str_repeat('0', $pad) . $str;
$results[] = $str;
}
return $results;
}
// 測試
var_dump(decToBase([128, 253], 2)); // ["10000000", "11111101"]
var_dump(decToBase([128, 253], 8)); // ["0200", "0375"]
var_dump(decToBase([128, 253], 16)); // ["80", "FD"]
function baseToDec($numbers, $base) {
static $map = ['0'=>0,'1'=>1,'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,
'8'=>8,'9'=>9,'A'=>10,'B'=>11,'C'=>12,'D'=>13,'E'=>14,'F'=>15];
!is_array($numbers) && $numbers = [$numbers];
if ($base === 10) return $numbers;
$results = [];
foreach ($numbers as $num) {
$chars = str_split(strtoupper($num));
$len = count($chars);
$sum = 0;
foreach ($chars as $i => $char) {
if (!isset($map[$char])) continue;
$sum += $map[$char] * pow($base, $len - $i - 1);
}
$results[] = $sum;
}
return $results;
}
// 測試
var_dump(baseToDec(['FF', 'FF33', 'CC33'], 16)); // [255, 65331, 52275]
var_dump(baseToDec(['1101101', '111101101'], 2)); // [124, 508]
var_dump(baseToDec(['1234123', '12341'], 8)); // [342099, 5345]
十進制 128 → 二進制:
128 ÷ 2 = 64 余 0
64 ÷ 2 = 32 余 0
32 ÷ 2 = 16 余 0
16 ÷ 2 = 8 余 0
8 ÷ 2 = 4 余 0
4 ÷ 2 = 2 余 0
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
逆序讀取:10000000
二進制 1101101 → 十進制:
1×2⁶ + 1×2⁵ + 0×2⁴ + 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 64 + 32 + 0 + 8 + 4 + 0 + 1 = 109
| 功能 | 函數 | 示例 |
|---|---|---|
| 十進制→二進制 | decbin() | decbin(128) = "10000000" |
| 十進制→八進制 | decoct() | decoct(128) = "200" |
| 十進制→十六進制 | dechex() | dechex(128) = "80" |
| 任意進制互轉 | base_convert() | base_convert('FF', 16, 2) = "11111111" |
| 二進制→十進制 | bindec() | bindec('1101') = 13 |
| 八進制→十進制 | octdec() | octdec('200') = 128 |
| 十六進制→十進制 | hexdec() | hexdec('80') = 128 |
理解底層算法能幫助你在無內置函數環境(如某些嵌入式 PHP 裁剪版)下工作,也能更好地優化性能敏感型代碼。