跳至
/** pack 的format
* a nul-padded string
* a space-padded string
* h hex string, low nibble first
* h hex string, high nibble first
* c signed char
* c unsigned char
* s signed short (always 16 bit, machine byte order)
* s unsigned short (always 16 bit, machine byte order)
* n unsigned short (always 16 bit, big endian byte order)
* v unsigned short (always 16 bit, little endian byte order)
* i signed integer (machine dependent size and byte order)
* i unsigned integer (machine dependent size and byte order)
* l signed long (always 32 bit, machine byte order)
* l unsigned long (always 32 bit, machine byte order)
* n unsigned long (always 32 bit, big endian byte order)
* v unsigned long (always 32 bit, little endian byte order)
* q signed long long (always 64 bit, machine byte order)
* q unsigned long long (always 64 bit, machine byte order)
* j unsigned long long (always 64 bit, big endian byte order)
* p unsigned long long (always 64 bit, little endian byte order)
* f float (machine dependent size and representation)
* d double (machine dependent size and representation)
* x nul byte
* x back up one byte
* z nul-padded string (new in php 5.5)
* @ nul-fill to absolute position
*/
2. [代码]使用例子-1 跳至$out = new outputstream();
$out->writenumber(100);
$out->writeshort(20);
$out->writestr("i love wanes",25);
$out->writechar("48");
$msg = $out->getoutstream();
echo $msg,"\n","长度:",$out->getlen(),"\n";
//*每个数据包的长度一般都是固定的
$in = new inputstream($msg);
echo $in->readnumber(0)," \n ";
echo $in->readshort(0+4)," \n ";
echo $in->readstr(4+2,25)," \n ";
echo $in->readchar(4+2+25)," \n ";
3. [代码]使用例子-2 swoole_client中发送/解析2进制 /**
* created by phpstorm.
* user: wanwan
* date: 16/4/6
* time: 上午9:02
*/
$serv = new swoole_server("127.0.0.1", 7890);
$serv->set(array(
'worker_num' => 1, //工作进程数量
'daemonize' => false, //是否作为守护进程
));
$serv->on('connect', function ($serv, $fd) {
echo "client: $fd connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
file_put_contents(__dir__ . "/test.txt", $data . "\n", file_append);
$in = new inputstream($data);
echo "长度 : ", $in->readnumber(0), " \n";
echo "指令 : ", $in->readnumber(4), " \n";
echo "流水号 : ", $in->readnumber(8), " \n";
echo "企业号 : ", $in->readstr(12, 6), " \n";
//echo "密钥串 : ",$in->readstr(18,16)," \n";
echo "版本号 : ", $in->readchar(18 + 16), " \n";
echo "时间戳 : ", $in->readnumber(18 + 16 + 1), " \n";
$out = new outputstream();
$out->writenumber(100);
$out->writeshort(20);
$out->writestr("i love wanes",25);
$out->writechar("48");
$msg = $out->getoutstream();
echo $msg,"长度 :",$out->getlen(),"\n";
$serv->send($fd, $msg);
$serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
echo "client: $fd close.\n";
});
$serv->start();
4. [文件] inputstram.php ~ 2kb
stream = $stream_str;
}
/**
* 私有方法:截取流字符串
* @param $star 开始位置
* @param $len 截取长度
* @return string 返回截取好对应字段的流字符串
*/
private function read($star, $len)
{
return substr($this->stream, $star, $len);
}
/**
* @inheritdoc 读取一个32位的数字,注:php中int和java的long/short是对等的
* @param $star 开始位置
* @param int $len 长度,默认是int
* @param bool $sign 是否是signed类型,默认不是
* @return mixed 返回一个number
*/
public function readnumber($star, $len = 4, $sign = false)
{
$temp = unpack($sign ? "l" : "n", $this->read($star, $len));
return $temp[1];
}
/**
* @inheritdoc 读取定长字符串
* @param $star 开始位置
* @param int $len 长度
* @param bool $sign 是否是signed类型,默认不是
* @return mixed 返回一个字符串
*/
public function readstr($star, $len, $sign = false)
{
$format = $sign ? "a" : "a";
$temp = unpack($format . $len, $this->read($star, $len));
return $temp[1];
}
/**
* @inheritdoc 读取短数字
* @param $star 开始位置
* @param bool $sign 是否是signed类型,默认不是
* @return mixed 返回一个short
*/
public function readshort($star, $sign = false)
{
$temp = unpack($sign ? "s" : "n", $this->read($star, 2));
return $temp[1];
}
/**
* @inheritdoc 读一个字洁/字符 = java.readbyte
* @param $star 开始位置
* @param bool $sign 是否是signed类型,默认不是
* @return mixed 返回一个char
*/
public function readchar($star, $sign = false)
{
$temp = unpack($sign ? "c" : "c", $this->read($star, 1));
return $temp[1];
}
/**
* @inheritdoc 读一个字节型字符串 = java.readbytes
* @param $star 开始位置
* @param int $len 长度,默认是1
* @param bool $sign 是否是signed类型,默认不是
* @return mixed 返回一个number
*/
public function readchars($star,$len = 1,$sign = false)
{
$temp = unpack($sign ? "c$len" : "c$len", $this->read($star, $len));
return $temp[1];
}
}
5. [文件] outputstream.php ~ 2kb stream .= pack($format, $number);
$this->len+=$len;
}else{
$this->stream .= pack($sign?"l":"n", $number);
$this->len+=4;
}
}
/**
* @inheritdoc 写入一个byte
* @param $char
* @param bool $sign 是否signed类型数据
* @inheritdoc 这默认是8位/1字节的char = java.writebyte
*/
public function writechar($char,$sign = false)
{
$this->stream .= pack($sign?"c":"c", $char);
$this->len+=1;
}
/**
* @inheritdoc 字符串以byte的形式写入流 = java.writebytes
* @param $str
* @param int $len 字符串长度
* @param bool $sign 是否signed类型数据
*/
public function writechars($str,$len = 1,$sign = false)
{
$this->stream .= pack($sign?"c$len":"c$len", $str);
$this->len+=1;
}
/**
* @inheritdoc 写定长字符串
* @param $str
* @param $len 字符串长度
* @param bool $sign 是否signed类型数据
*/
public function writestr($str, $len,$sign = false)
{ $format =$sign? "a" : "a" ;
$this->stream .= pack($format.$len, $str);
$this->len+=$len;
}
/**
* @inheritdoc 这默认是16位/2字节的short
* @param $short short数据
* @param bool $sign 是否是signed类型,默认不是
*/
public function writeshort($short,$sign = false)
{
$this->stream .= pack($sign?"s":"n", $short);
$this->len+=2;
}
/**
* @return string 返回2进制流
*/
public function getoutstream()
{
return $this->stream;
}
/**
* @return int获取流字节长度
*/
public function getlen(){
return $this->len;
}
}