php pack unpack
学习
pack
string pack ( string $format [, mixed $args [, mixed $... ]] )
该函数用来将对应的参数($args)打包成二进制字符串
unpack
array unpack ( string $format , string $data )
format
如下选项
a | 以NUL字节填充字符串空白 |
A | 以SPACE(空格)填充字符串 |
h | 十六进制字符串,低位在前 |
H | 十六进制字符串,高位在前 |
c | 有符号字符 |
C | 无符号字符 |
s | 有符号短整型(16位,主机字节序) |
S | 无符号短整型(16位,主机字节序) |
n | 无符号短整型(16位,大端字节序) |
v | 无符号短整型(16位,小端字节序) |
i | 有符号整型(机器相关大小字节序) |
I | 无符号整型(机器相关大小字节序) |
l | 有符号长整型(32位,主机字节序) |
L | 无符号长整型(32位,主机字节序) |
N | 无符号长整型(32位,大端字节序) |
V | 无符号长整型(32位,小端字节序) |
q | 有符号长长整型(64位,主机字节序) |
Q | 无符号长长整型(64位,主机字节序) |
J | 无符号长长整型(64位,大端字节序) |
P | 无符号长长整型(64位,小端字节序) |
f | 单精度浮点型(机器相关大小) |
d | 双精度浮点型(机器相关大小) |
x | NUL字节 |
X | 回退一字节 |
Z | 以NUL字节填充字符串空白(new in PHP 5.5) |
@ | NUL填充到绝对位置 |
作用
- 常用于tcp,udp服务的数据通信
- 自我脑补
应用
demo代码
git clone https://github.com/josephtseng-echo/php.git
实例
<?php include(__DIR__.'/../spl_autoload.php'); use Package\Write; $pw = new Package\Write(); $pw->writeBegin("123"); $pw->writeString("abc"); $pw->writeEnd(); $buff = $pw->getPacketBuffer(); $pr = new Package\Read(); if($pr->readPackageBuffer($buff) == true){ //print_r($pr->getHeaderInfo()); //echo $pr->getCmd(); } //test class EncryptDecrypt $ed = new Package\EncryptDecrypt(); $str = "123"; echo $str."\n"; $buff = pack("N", $str); echo $buff."\n";; $e = $ed->encryptBuffer($buff, 0, strlen($buff)); echo $e."\n"; $d = $ed->decryptBuffer($buff, strlen($buff), $e); var_dump($d)."\n"; echo $buff."\n"; $ua = unpack('Na', $buff); echo $ua['a']."\n";
以上代码只是对package模块封装的测试。
当然,实际tcp或udp服务应用中,需要自己定义好协议,信息头长度多少,参数是什么等等。
当然,在package write的时候,为了安全,可以进行加密;package read的时候,对应解密即可;详细可以参考class EncryptDecrypt。
至于如何封装,如:将$e 封装到header参数 package read的时候 获取 $e 进行对应的解密,代码自行脑补……
- Author: josephzeng
- License: CC BY-NC-ND 4.0