2015-11-18 80 views
0

我需要能夠將字符串轉換爲其二進制部分。說我有字符串:如何將字符串來回轉換爲二進制

"R!Testing" 

我想要一個函數返回相應的二進制:

"010100100010000101010100011001010111001101110100011010010110111001100111" 

,也有其他功能也打開二進制字符串​​的例子那樣。目前我正在使用以下內容。

function messageToBinary($message) { 
    $value = unpack('H*', $message); 
    return base_convert($value[1], 16, 2); 
} 
// Turn string of bits into its text equivalent 
function binaryToMessage($binary) { 
    return pack('H*', base_convert($binary, 2, 16)); 
} 

這當然有幾個問題,我相信。有些字符失敗(我認爲是因爲16是最大值?)以便正確轉換,並且由於溢出問題,base_convert有時會因大字符串而失敗。

什麼是更好的方法?

回答

1

做一個循環而不是試圖把整件事看作一個大數字。 ord()返回字符的字符代碼,並且可以使用sprintf()將其轉換爲固定長度的二進制數字。

function messageToBinary($message) { 
    $len = strlen($message); 
    $result = ''; 
    for ($i = 0; $i < $len; $i++) { 

     $result .= sprintf("%08b", ord($message[$i])); 
    } 
    return $result; 
} 

爲了走另一條路,提取字符串的8位段,從二進制將它們轉換爲十進制,然後使用chr()將其轉換成一個字符。

function binaryToMessage($binary) { 
    $len = strlen($binary); 
    $result = ''; 
    for ($i = 0; $i < $len; $i += 8) { 
     $n = substr($binary, $i, 8); 
     $result .= chr(bindec($n)); 
    } 
    return $result; 
} 

請注意,這僅適用於8位字符。對於Unicode,您需要變得更加複雜。

+0

好的,讓我來實現它。 – modesitt

+0

在回來的路上,我應該嘗試從二進制數中獲取字符代碼並將其轉換爲字符串? – modesitt

+0

我已經添加了反向功能 – Barmar

相關問題