二进制转换,PHP字符串(含中文)转二进制串代码
function StrToBin($str){
$arr = preg_split('/(?
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 '
';
echo BinToStr('111001101001110010001001 111001001011100010000000 111010011010001010010111 111001111000100110011011 111010011000000010111100 111001111001101010000100 111001011011111110000011 111011111011110010001100 111001001011110110100000 111001011011000010110001 111001011000111110101111 111001001011101110100101 111001111000100110011011 111010011000000010111100 111001001011101010001110 111001011010010010101001 111001001011100010001011 111011111011110010000001');
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
functionStrToBin($str){
$arr=preg_split('/(?
foreach($arras&$v){
$temp=unpack('H*',$v);
$v=base_convert($temp[1],16,2);
while($v<8)$v='0'.$v;
unset($temp);
}
returnjoin(' ',$arr);
}
functionBinToStr($str){
$arr=explode(' ',$str);
foreach($arras&$v){
$v=pack("H".strlen(base_convert($v,2,16)),base_convert($v,2,16));
}
returnjoin('',$arr);
}
echoStrToBin("织梦先生");
echo'
';
echoBinToStr('111001101001110010001001 111001001011100010000000 111010011010001010010111 111001111000100110011011 111010011000000010111100 111001111001101010000100 111001011011111110000011 111011111011110010001100 111001001011110110100000 111001011011000010110001 111001011000111110101111 111001001011101110100101 111001111000100110011011 111010011000000010111100 111001001011101010001110 111001011010010010101001 111001001011100010001011 111011111011110010000001');
代码解释:
preg_split是php正则匹配并切割字符串的函数, 接收两个参数, 第一个参数是正则表达式, 第二个参数是要切割的字符串, 详情请自己翻手册
‘/(?
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位的二进制串补全