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

PHP 進制轉換核心算法實現:二進制、八進制、十六進制互轉

     編輯:PHP 相關知識

PHP 進制轉換核心算法實現:二進制、八進制、十六進制互轉

深度解析進制轉換數學原理,提供不依賴內置函數的純 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

PHP 內置函數對照表

功能函數示例
十進制→二進制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

實際應用場景

  • 網絡協議解析(IP 地址、端口、標誌位操作)
  • 文件格式解析(BMP頭、PNG塊、ELF魔數)
  • 權限系統(Linux 權限掩碼、RBAC 位運算)
  • 哈希/加密算法實現(位運算、移位、異或)
  • 嵌入式通訊(Modbus、CAN 總線數據打包)

理解底層算法能幫助你在無內置函數環境(如某些嵌入式 PHP 裁剪版)下工作,也能更好地優化性能敏感型代碼。

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