$string = pack('a6', 'china '); var_dump($字符串); //输出结果:string(6)“china”,最后一个字节不可见NUL 回声命令($字符串[5]); //输出结果:0(ASCII码中的0对应nul) //类似A $string = pack('A6', '中国'); var_dump($字符串); //输出结果:string(6)“china”,最后一个字节为空格 回声命令($字符串[5]); //输出结果:32(ASCII码中的32对应一个空格)
[图片上传失败...(image-5d8a61-1577941896554)]
自带ASCII表(linux/unix下可以使用man ascii查看)
h 和 H
$string = pack('H3', 281); var_dump($字符串); //输出结果:string(2)“(“ for($i=0;$i 登录后复制
h,H需要特别说明。他们将相应的参数视为十六进制字符,然后进行打包。这意味着什么?例如上面的281在打包之前会被转换为0x281,因为一位十六进制数字对应四位二进制数字。上面的0x281只有1.5个字节,默认会补0变成0x2810,即0x28对应的十进制。是40((),0x10对应的小数是16(le看不见的字符)。
c 和 C
$string = pack('c3', 67, 68, -1); var_dump($字符串); //输出:字符串(3)“CD�”for($i=0;$i 登录后复制
最终输出应该是67 68 -1
ord 获取字符的 ASCII 码(范围 0-255)。此时-1(0000 0001)对应的字符将以补码的形式输出,即255(1111 1110 + 0000 0001 = 1111 1111)
整数相关
所有整数类型的使用方式完全相同。只需注意它们的位和字节顺序即可。下面以L为例:
$string = pack('L', 123456789); var_dump($字符串); //输出:字符串(4)“�[“ for($i=0;$i 登录后复制
f和d
$string = pack('f', 12345.123); var_dump($字符串); //输出:string(4) "~�@F" var_dump(unpack('f', $string)); //这里提前使用了unpack,后面会解释 //输出:float(12345.123046875)
f和d打包为浮点数。至于为什么打包前是12345.123,解包后是12345.123046875,这和浮点数的存储有关系。
x、X、Z、@
$string = pack('x'); //打包一个null字符串 回显命令($字符串); //输出:0
关于X(大写
$string = pack('Z2', 'abc5'); //其实就是从Z后面的数字位置开始,全部设置为nul var_dump($字符串); //输出:字符串(2)“a”for($i=0;$i 登录后复制
$string = pack('@4'); //我理解为填充N nul var_dump($字符串); //输出:字符串(4)“” for($i=0;$i 登录后复制
解压
array unpack ( string $format , string $data )
unpack 的使用非常简单。它只是讲对pack打包的数据进行解包。使用打包时使用的任何参数。开箱,具体用法我懒得讲了,举几个小例子:
$string = pack('L4', 1, 2, 3, 4); var_dump(unpack('L4', $string)); //输出: 数组(4){ [1]=> 整数(1) [2]=> 整数(2) [3]=> 整数(3) [4]=> 整数(4) } $string = pack('L4', 1, 2, 3, 4); var_dump(unpack('Ll1/Ll2/Ll3/Ll4', $string)); //可以指定key并用/分割 //输出: 数组(4){ [“l1”]=> 整数(1) [“l2”]=> 整数(2) [“l3”]=> 整数(3) [“l4”]=> 整数(4) }
这两个功能有什么用
·数据通信(通过二进制格式与其他语言通信)
·数据加密(如果不告诉第三方你的打包方式,对方拆包会比较困难)
·节省空间(例如将比较大的数字存储为字符串会浪费大量空间,而打包成二进制格式只需要4位数字<32位数字>)
PHP中文网有大量免费的PHP入门教程,欢迎大家学习!
本文转载自:https://www.sychzs.cn/p/942907071a4c