菜鸟国际电子游戏首页 > 文章中心 > 正文

php 杂项函数中的pack与unpack-电子游戏app下载



数据通信(通过二进制格式与其它语言通信)
数据加密(如果不告诉第三方你的打包方式,对方解包的难度就相对大很多)
节省空间(比如比较大的数字按字符串储存会浪费很多空间,打包成二进制格式才需要4位<32位数字>)  


codedescription
anul字节填充字符串空白
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双精度浮点型(机器相关大小)
xnul字节
x回退一字节
z以nul字节填充字符串空白(new in php 5.5)
@nul填充到绝对位置


字节序是什么?

就是字节的顺序,通俗点就是多字节数据的存放顺序(一个字节显然不需要顺序)。
比如a和b分别对应的二进制表示为0100 0001、0100 0010。对于储存字符串ab,我们可以0100 0001 0100 0010也可以0100 0010 0100 0001,这个顺序就是所谓的字节序。


关于 pack 函数:  
下面的第一部分把数字值包装成字节:  
$out = pack("cccc", 65, 66, 67, 68); //$out 等于"abcd"
$out = pack("c4", 65, 66, 67, 68); //$out 等于"abcd"
下面的做类似的事情,增加了一些空:
$out = pack("ccxxcc", 65, 66, 67, 68); //$out 等于 "ab\0\0cd"

打包你的短整数并不意味着你就可移植了:
$out = pack("s2", 1, 2);
//在小头在前的机器上是 "\1\0\2\0"
//在大头在前的机器上是 "\0\1\0\2"

在十六进制包装上,count 指的是位或者半字节的数量,而不是生成的字节数量:
$out = pack("h16", "4954726f6f6b6965"); //生成“itrookie”

a 域里的长度只应用于一个字串:
$out = pack("a4", "abcd", "x", "y", "z"); //"abcd"

要绕开这个限制,使用多倍声明:
$out = pack("aaaa", "abcd", "x", "y", "z"); //"axyz"
$out = pack("a" x 4, "abcd", "x", "y", "z"); //"axyz"

a 格式做空填充:
$out = pack("a14", "abcdefg"); //" abcdefg\0\0\0\0\0\0"

关于 unpack 函数:

array unpack ( string $format, string $data )

$data = "010000020007";
unpack("sint1/cchar1/sint2/cchar2",$data);

## array('int1'=>1, 'char1'=>'0','int2'=>2,'char2'=>7);

最后本文开头讲到的协议使用pack/unpack 举例程序代码为 :

$lastact = pack('scsa32a32',0x0040, 0x00, 0x0006, $username, $passwd );

unpack('sint1/cchar1/sint2/cchar2/',$lastmessage);



16进制数必须以 0x开头  


转载请注明出处:

0

相关文章