我需要能够将字符串转换为二进制部分。说我有字符串:
"R!Testing"
我想要一个函数来返回相应的二进制文件:
"010100100010000101010100011001010111001101110100011010010110111001100111"
并且还有另一个函数也可以在字符串"R!Testing"
中转换该二进制文件。目前我正在使用以下内容。
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有时会因大字符串而失败。
什么是更好的方法?
答案 0 :(得分: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,您需要变得更复杂。