浅谈PHP中打包和解包的详细用法
PHP中有两个打包和解包的函数。很多PHPer从来没有在实际项目中使用过,他们甚至不知道这两种方法是用来做什么的。本文将介绍它们的用途。
包装
Stringpack(字符串$格式[,混合$args [,混合$.])该函数用于将相应的参数($ args)打包成二进制字符串。
第一个参数$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无符号长整数()。 小端)q有符号长整数(64位,主机端)q无符号长整数(64位,主机端)j无符号长整数(64位,大端)p无符号长整数(64位,小端)f单精度浮点类型(机器相关大小)d双精度浮点类型(机器相关大小)x NUL字节x后退一个字节z用NUL字节填充字符串空白(PHP 5.5中新增)@ NUL填充到绝对位置。看了这么多参数,第一次真的很疑惑,大部分解释都很容易理解,但是主机、大端、小端的字节顺序是什么?下一节的内容很枯燥,但你一定要理解。坚持下去。
字节顺序是什么?
它是字节的数量级。说白了就是多字节数据的存储顺序(一个字节显然不需要顺序)。
例如,A和B的对应二进制表示分别是0100 0001和0100 0010。对于存储的字符串AB,我们可以是0100 0001 0100 0010或0100 0010 0100 0001。这种顺序称为字节顺序。
高/低字节
例如,字符串AB,左高右低(我们正常的读取顺序),A是高字节,B是低字节
高/低地址
假设0x123456按照从上到下的顺序存储,内存存储如下:
高位地址-低位地址12-34-56
大端(网络端)
大的一端是把高位字节放入内存的低位地址端,低位字节放入高位地址端。在网络传输(如TCP/IP)中,低位地址端(高位字节)放在流的开头。对于2字节字符串(AB),传输顺序为A(0-7位)和B(8-15位)。
那么小端的字节顺序自然与大端相反。
主机字节顺序
表示机器当年的字节顺序(即网络字节顺序确定,主机字节顺序根据机器确定),一般为小端字节顺序。
A和A(打包的字符串,用NUL或空格填充)
$string=pack('a6 ',' China ');var _ dump($ string);//输出结果为:字符串(6)‘China’,最后一个字节为不可见的null ehord($ string[5]);//输出结果为: 0(ASCII码中的0对应nul)//A $string=pack('A6 ',' China ');var _ dump($ string);//输出结果为:字符串(6)‘China’,最后一个字节为空格echo order($ string[5]);//输出结果: 32(ASCII码中的32对应空格)
附件是一个ASCII表(可以在linux/unix下通过man ascii查看)
h和h
$string=pack('H3 ',281);var _ dump($ string);//输出结果是$i=0的:字符串(2)“(”;$ is tren($ string);$ I){ echo order($ string[$ I])。PHP _ EOL}//输出结果: 40 16h和h需要特别说明。他们将相应的参数视为十六进制字符,然后将其打包。你什么意思?比如上面的281在打包前会转换成0x281,因为十六进制的一位对应二进制的四位,上面的0x281只有1.5字节,默认会变成0x2810。0x28对应的小数是40(),0x10对应的小数是16(dle不可见字符)。明白吗?如果你不明白,请给我留言。
c和c。
$string=pack('c3 ',67,68,-1);var _ dump($ string);//输出:字符串(3)“CD”为($ I=0;$ is tren($ string);$ I){ echo order($ string[$ I])。PHP _ EOL}//输出: 67 68 225最终输出本能应该是67 68 -1
Ord得到字符的ASCII码(范围0-255),那么对应于-1(0000 0001)的字符将以补码的形式输出,即255(1111 1110 0000 0001=1111 1111)
整数相关
所有整数类型都以完全相同的方式使用,只需注意它们的位和字节顺序。让我们以L为例
$string=pack('L ',123456789);var _ dump($ string);//输出:字符串(4)'[' for($ I=0;$ is tren($ string);$ I){ echo order($ string[$ I])。PHP _ EOL}//输出: 21 205 91 7f和d
$string=pack('f ',12345.123);var _ dump($ string);//输出:字符串(4)' ~ @ f' var _ dump (unpack ('f ',$ string));//这里提前使用了unpack,后面会解释。//输出:float(12345.123046875)f和D为浮点数打包。至于为什么打包前是12345.123046875,拆包后是12345.123046875,这和浮点数的存储有关系。稍后,我们可以单独开一篇文章来解释IEEE标准。
X、X、Z、@
$ string=pack(' x ');//打包一个nul字符串echo order($ string);//输出: 0约x(大写x)。我试了n次,但不知道怎么用。如果你有干净的童鞋,可以给我留言。谢谢你。
$string=pack('Z2 ',' abc5 ');//其实从Z后面的数字位置开始,全部都会设置为nullvar _ dump($ string);//output : string(2)“a”for($ I=0;$ is tren($ string);$ I){ echo order($ string[$ I])。PHP _ EOL}//输出: 97 0 $ string=pack(' @ 4 ');//我理解为填充n nullvar _ dump($ string);//为($i=0)输出:字符串(4)';$ is tren($ string);$ I){ echo order($ string[$ I])。PHP _ EOL}//输出: 0 0 0 0解包
Array Unpack (String $ Format,String $ Data) Unpack的使用非常简单,也就是说,对打包的数据进行解包,并使用打包时使用的任何参数对数据进行解包。具体用途我就懒得说了。列举几个小例子。
$string=pack('L4 ',1,2,3,4);var_dump(解包(' L4 ',$ string));//输出: array(4){[1]=int(1)[2]=int(2)[3]=int(3)[4]=int(4)} $ string=pack(' l4 ',1,2,3,4);var_dump(解包(' Ll1/Ll2/Ll3/Ll4 ',$ string));//可以指定key,并使用/split//来输出: array(4){[' L1 ']=int(1)[' L2 ']=int(2)[' L3 ']=int(3)[' l4 ']=int(4)}。这两个功能的目的是什么
数据通信(通过二进制格式与其他语言通信)数据加密(如果不告诉第三方你的打包方式,对方解包会相对困难)节省空间(例如,根据字符串存储大量数字会浪费大量空间,打包成二进制格式只需要4位32位数字)。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:浅谈PHP中打包和解包的详细用法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。