PHP: pack/unpack补遗
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对同一个整数进行打包,如果结果相等,则本机字节序就是大端序,否则就是小端序。代码如下: <?php define('BIG_ENDIAN', pack('L', 1) === pack('N', 1)); if (BIG_ENDIAN) { echo "大端序"; } else { echo "小端序"; } echo "\n"; $ php -f test.php 小端序 大端序和小端序事实上是相反的字节序,比如要实现无符号短整型的大端序和小端序,可以用s格式化字符先进行打包,再判断大小端来决定是否需要反转字符串,代码如下: <?php