PHP: pack/unpack补遗
来源:互联网 发布:java定义常量 编辑:程序博客网 时间:2024/05/22 03:09
pack/unpack的介绍和使用加上这篇就第三篇了。确实知识点比较多,这篇算是收尾之作吧。仔细去文档上看pack/unpack的格式化字符说明,就会发现s, S, i, I, l, L, f, d都没有对应的大端序和小端序的格式化字符,所以有需要的时候必须自己实现。这个真不知道PHP开发项目组是怎么想的!
而且确实有人在stackoverflow上这么问了,详见:php-pack-format-for-signed-32-int-big-endian 。stackoverflow上的答案比较巧妙,所以我在这里进行借鉴。
L表示无符号长整型,按主机字节序。N表示无符号长整型,大端序。它们都是32位的,所以如果用L和N对同一个整数进行打包,如果结果相等,则本机字节序就是大端序,否则就是小端序。代码如下:
<?phpdefine('BIG_ENDIAN', pack('L', 1) === pack('N', 1));if (BIG_ENDIAN){ echo "大端序";}else{ echo "小端序";}echo "\n";
$ php -f test.php小端序
大端序和小端序事实上是相反的字节序,比如要实现无符号短整型的大端序和小端序,可以用s格式化字符先进行打包,再判断大小端来决定是否需要反转字符串,代码如下:
<?phpdefine('BIG_ENDIAN', pack('L', 1) === pack('N', 1));// 有符号16位整型大端序function pack_int16s_be($num){ if (BIG_ENDIAN) { return pack("s", $num); } return strrev(pack("s", $num));}// 有符号16位整型小端序function pack_int16_le($num){ if (BIG_ENDIAN) { return strrev(pack("s", $num)); } return pack("s", $num);}
其它几个也是类似如此实现。但是需要注意的是还需要实现相应版本的unpack,可参考我之前的一篇文章:PHP: chr和pack、unpack那些事 。
对于实现这几个函数倒不是难事,但在实际打包解包的时候就比较麻烦了。pack还比较好,只是分开打包,再作字符串连接。但是对unpack来说,需要根据协议长度,将字节流拆分然后分别解包,确实有点坑。
本篇文章基本上也就这些知识点,pack/unpack就告一段落了,欢迎大家一起交流~
0 0
- PHP: pack/unpack补遗
- PHP: pack/unpack补遗
- PHP pack unpack 用法
- php pack unpack
- PHP: 深入pack/unpack
- PHP: 深入pack/unpack
- PHP 二进制 pack() unpack()
- PHP: 深入pack/unpack
- PHP: 深入pack/unpack
- PHP: 深入pack/unpack
- PHP: 深入pack/unpack
- PHP: 深入pack/unpack
- php中pack与unpack
- php中pack与unpack
- PHP pack() 函数 与 unpack() 函数
- PHP数据压缩、加解密(pack, unpack)
- PHP数据压缩、加解密(pack, unpack)
- PHP pack和unpack函数详解
- tcl/tk参考——控制结构catch
- PHP: chr和pack、unpack那些事
- Swift字典
- nyoj-488-素数环
- 【leetcode】No.141 Linked List Cycle
- PHP: pack/unpack补遗
- 物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004
- js 设置cookie 读取cookie
- tcl/tk参考——控制结构error
- CXF发布restful WebService的入门例子(服务器端)
- App-UI测试的主要内容
- 关于css的标准盒子模型
- Android悬浮窗实现 使用WindowManager
- android ndk-bulid