在處理網絡協議、加密演算法或底層數據存儲時,經常需要在字符串與二進制表示之間轉換。PHP 並未提供內建的「字符串轉二進制」函數,但結合 unpack()、pack() 與 base_convert() 即可輕鬆實現。本文提供兩個可直接投入生產的函數,並解析其原理。
<?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);
}
?>
<?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)
?>
preg_split('/(?<!^)(?!$)/u', $str) 利用零寬斷言在每個 Unicode 字符邊界切分,正確處理多位元組字符。unpack('H*', $char) 將字符的原始位元組序列轉為十六進制字符串,避免直接在二進制字符串上操作導致的位元組序問題。base_convert() 在 2、16 進制間轉換,注意它處理的是字符串表示的數字,而非二進制位元組流。pack('H*', $hex) 將十六進制字符串解析為原始位元組序列,完成反向轉換。mb_convert_encoding() 轉換。base_convert() 會省略高位的零,導致單字符二進制長度不固定(如 'A' → '1000001' 而非 '01000001')。若需固定 8/16/32 位,請使用 sprintf('%08b', ord($char)) 或位運算。bin2hex() 整體轉十六進制,再分塊轉二進制,或使用擴展(如 gmp)加速。此類轉換常用於: