最近看了一一個PHP SOCKET服務端代碼,對于其中對SOKET協(xié)議的數(shù)據(jù)解析部分看不明白,就是以下代碼中的uncode方法;希望知道的牛人解答下,謝謝!附件中有相關客戶端和服務端代碼!
function uncode($str,$key){
$mask = array();
$data = '';
$msg = unpack('H*',$str);
// print_r($msg); echo "\r\n";
$head = substr($msg,0,2);
if ($head == '81' && !isset($this->slen)) {
$len=substr($msg,2,2);
$len=hexdec($len);
if(substr($msg,2,2)=='fe'){
$len=substr($msg,4,4);
$len=hexdec($len);
$msg=substr($msg,4);
}else if(substr($msg,2,2)=='ff'){
$len=substr($msg,4,16);
$len=hexdec($len);
$msg=substr($msg,16);
}
$mask[] = hexdec(substr($msg,4,2));
$mask[] = hexdec(substr($msg,6,2));
$mask[] = hexdec(substr($msg,8,2));
$mask[] = hexdec(substr($msg,10,2));
$s = 12;
$n=0;
}else if($this->slen > 0){
$len=$this->slen;
$mask=$this->ar;
$n=$this->n;
$s = 0;
}
$e = strlen($msg)-2;
for ($i=$s; $i<= $e; $i+= 2) {
$data .= chr($mask^hexdec(substr($msg,$i,2)));
$n++;
}
$dlen=strlen($data);
if($len > 255 && $len > $dlen+intval($this->sjen)){
$this->ar=$mask;
$this->slen=$len;
$this->sjen=$dlen+intval($this->sjen);
$this->sda=$this->sda.$data;
$this->n=$n;
return false;
}else{
unset($this->ar,$this->slen,$this->sjen,$this->n);
$data=$this->sda.$data;
unset($this->sda);
return $data;
}
}