<?php
header("charset=utf-8;");
function StrToBin($str){
$arr = preg_split('/(?<!^)(?!$)/u', $str);
foreach($arr as &$v){
$temp = unpack('H*', $v);
$v = base_convert($temp[1], 16, 2);
while($v<8)$v='0'.$v;
unset($temp);
}
return join('',$arr);
}
function BinToStr($str){
$arr = explode(' ', $str);
foreach($arr as &$v){
$v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16));
}
return join('', $arr);
}
echo StrToBin("千与千寻");
echo BinToStr('1100001 1100001 1100001 1100011 1100011 1100011 111001011010010010101001 111001111010100110111010');
代码解释:
preg_split是php正则匹配并切割字符串的函数, 接收两个参数, 第一个参数是正则表达式, 第二个参数是要切割的字符串, 详情请自己翻手册
'/(?<!^)(?!$)/u'是匹配随意一个字符的正则表达式, 例如一个字母, 一个数字, 一个符号, 一个汉字等等, 具体想了解这个正则, 请百度"正则 断言"
unpack则是把一个字符变成一段进制码, 具体看unpack的第一个参数, 这里是'H'代表16进制, 还有其他的参数, 自行翻手册, 其中手册没有说明'H'后面的*是什么意思, 它表示的是转换所有, 如果填'H2'表示转换2个, 如果一个汉字转16进制是三个字节6位16进制码, 'H2'则只转换前两位16进制, 'H*'表示都转换
base_convert这个函数估计都可以从英文意思知道了, 就是进制转换的意思, 我这里是把2进制和16进制转换, 其中要注意的是, 16进制转2进制后, 如果其二进制不足八位, 其不会在前面加0, 比如a的16进制是61, 二进制是0110 0001, 转换后2进制的字符串就变成了110 0001而丢了开头的0, 但是16进制的不会, 比如\n的16进制是0A, 他不会丢了前面的0, 因此我在第8行用while来把不够8位的二进制串补全