二进制转换,PHP字符串(含中文)转二进制串代码
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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 '<br>'; echo BinToStr('111001101001110010001001 111001001011100010000000 111010011010001010010111 111001111000100110011011 111010011000000010111100 111001111001101010000100 111001011011111110000011 111011111011110010001100 111001001011110110100000 111001011011000010110001 111001011000111110101111 111001001011101110100101 111001111000100110011011 111010011000000010111100 111001001011101010001110 111001011010010010101001 111001001011100010001011 111011111011110010000001'); |
代码解释:
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位的二进制串补全