在现在的项目中,需要用php去解码7bit的传输编码, 本来想从网上找个现成的直接用, 没找到, 参考了大神的C++解码方法, 换成了php的. 需要的请拿走.
//GSM 短信中的7bit压缩传输解码
private function decode_7bit($str){
if(strlen($str) < 2) return false;
$str_src = str_split($str,2); //以两个字符为单位分割
$str_build = ""; //最终输出的字符串
$str_cu = ""; //当前循环应该处理的字符串
$str_la = ""; //上一个循环中遗留的字符串(补位的字符串给还回去)
$key_move = 1; //偏移量 取值范围(1-7)
foreach($str_src as $item){
$item = base_convert($item,16,2); //16进制转2进制
$pre = ""; //补0位
if(strlen($item) < 8){ //未满8位的 前面补0 补够8位
for($i=0;$i<(8-strlen($item));$i++){
$pre .= "0";
}
}
$item = $pre . $item; //拼接完成满8位的二进制串
$str_cu = substr($item,$key_move); //截取当前计算位
if($str_la != "") $str_cu .= $str_la;
$str_la = substr($item,0,$key_move); //截取遗留位
$str_cu = "0".$str_cu; //前面补0 ,7位补8位 不是必须的
$str_build .= chr(base_convert($str_cu,2,10));
if(strlen($str_la) == 7){
$str_build .= chr(base_convert("0".$str_la,2,10));
$str_la = ""; //遗留位清空
$key_move = 1; //偏移量归1
}else{
$key_move++;
}
}
return $str_build;
}
直接把你的7bit编码传进去就好了. 欢迎留言讨论.~
网友评论