萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 字符串與二進制互轉完整指南

在處理網絡協議、加密演算法或底層數據存儲時,經常需要在字符串與二進制表示之間轉換。PHP 並未提供內建的「字符串轉二進制」函數,但結合 unpack()、pack() 與 base_convert() 即可輕鬆實現。本文提供兩個可直接投入生產的函數,並解析其原理。

核心函數實現

字符串 → 二進制 (StrToBin)

<?php
/**
 * 將 UTF-8 字符串轉為以空格分隔的二進制字符串
 * @param string $str 輸入字符串
 * @return string 如 "1110000 1101000 1110000 ..."
 */
function StrToBin($str) {
    // 1. 將字符串拆分為單個字符(支援多位元組 UTF-8)
    $chars = preg_split('/(?<!^)(?!$)/u', $str);
    
    // 2. 逐字符轉換
    foreach ($chars as &$char) {
        // unpack('H*') 取得十六進制表示
        $hex = unpack('H*', $char);
        // base_convert 從 16 進制轉 2 進制
        $char = base_convert($hex[1], 16, 2);
    }
    
    return implode(' ', $chars);
}
?>

二進制 → 字符串 (BinToStr)

<?php
/**
 * 將空格分隔的二進制字符串還原為原始字符串
 * @param string $binStr 如 "1110000 1101000 ..."
 * @return string 原始字符串
 */
function BinToStr($binStr) {
    $bins = explode(' ', $binStr);
    foreach ($bins as &$bin) {
        // 2進制 → 16進制
        $hex = base_convert($bin, 2, 16);
        // pack('H*') 將十六進制字符串打包為二進制數據
        // 注意:pack('H*') 期望偶數長度的十六進制字符串
        $bins = pack('H*', $hex);
    }
    return implode('', $bins);
}
?>

使用示例

<?php
$original = 'PHP二次開發:www.php2.cc';
$binary   = StrToBin($original);
$restored = BinToStr($binary);

echo "原文: $original\n";
echo "二進制: $binary\n";
echo "還原: $restored\n";
// 輸出驗證
var_dump($original === $restored); // bool(true)
?>

原理解析

  1. 字符拆分:preg_split('/(?<!^)(?!$)/u', $str) 利用零寬斷言在每個 Unicode 字符邊界切分,正確處理多位元組字符。
  2. 十六進制中介:unpack('H*', $char) 將字符的原始位元組序列轉為十六進制字符串,避免直接在二進制字符串上操作導致的位元組序問題。
  3. 進制轉換:base_convert() 在 2、16 進制間轉換,注意它處理的是字符串表示的數字,而非二進制位元組流。
  4. 打包還原:pack('H*', $hex) 將十六進制字符串解析為原始位元組序列,完成反向轉換。

注意事項與優化

  • 編碼一致性:輸入字符串必須為 UTF-8,否則多位元組字符拆分會出錯。若來源編碼不同,請先用 mb_convert_encoding() 轉換。
  • 前導零保留:base_convert() 會省略高位的零,導致單字符二進制長度不固定(如 'A' → '1000001' 而非 '01000001')。若需固定 8/16/32 位,請使用 sprintf('%08b', ord($char)) 或位運算。
  • 大數據量效能:對於超大字符串,逐字符循環較慢。可考慮 bin2hex() 整體轉十六進制,再分塊轉二進制,或使用擴展(如 gmp)加速。

擴展應用

此類轉換常用於:

  • 自定義網絡協議的封包/解包
  • 位元組級別的加密/編碼演算法實現
  • 數據庫存儲二進制 Blob 時的可視化編碼
  • 教學演示字符編碼內部表示
copyright © 萬盛學電腦網 all rights reserved