UP | HOME

php pack unpack

Table of Contents

学习

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 进行对应的解密,代码自行脑补……

First created: 2017-03-06 20:38:35
Last updated: 2021-11-25 Thu 23:23
Power by Emacs 27.1 (Org mode 9.4)
© 2017 – 2021 by josephzeng