PHP的pack方法总结备忘

前面在研究websocket的时候用到了pack跟unpack方法,这两个方法一直让我感觉起来比较深奥,当时从网上找了很多资料来研究,现在把这两个函数的使用方法以及参数介绍记下来,以作备忘

先看pack方法的说明:

pack -- 将数据打包成二进制字符串
语法:string pack(string format, mixed [args]...);
参数一:format参数表示以什么格式格式化数据
参数二:将被格式化的数据


参数一的可选值:

aNUL-padded string
NULL填充字符串空白格式,返回1位,默认读取10进制数据
ASPACE-padded string
SPACE填充字符串空白格式,返回1位,默认读取10进制数据
hHex string, low nibble first
十六进制格式,每次格4位,低四位在前,默认读取10进制数据
HHex string, high nibble first
十六进制格式,每次格4位,高四位在前,默认读取10进制数据
csigned char
有符号字符格式,每次格8位,默认读取16进制数据
Cunsigned char
无符号字符格式,每次格8位,默认读取16进制数据
ssigned short (always 16 bit, machine byte order)
有符号短整型格式(每次格16位,以计算机字节顺序),默认读取16进制数据
Sunsigned short (always 16 bit, machine byte order)
无符号短整型格式(每次格16位,以计算机字节顺序),默认读取16进制数据
nunsigned short (always 16 bit, big endian byte order)
无符号短整型(每次格16位,以低端地址存放高位数据顺序),默认读取16进制数据  
vunsigned short (always 16 bit, little endian byte order)
无符号短整型(每次格16位,以低端地址存放低位数据顺序),默认读取16进制数据
isigned integer (machine dependent size and byte order)
有符号整形(每次格机器最大寻址位数的数据,以计算机字节顺序),默认读取16进制数据  
Iunsigned integer (machine dependent size and byte order)
无符号整形(每次格机器最大寻址位数的数据,以计算机字节顺序),默认读取16进制数据
lsigned long (always 32 bit, machine byte order)
有符号长整型格式(每次格32位,以计算机字节顺序),默认读取16进制数据
Lunsigned long (always 32 bit, machine byte order)
无符号长整型格式(每次格32位,以计算机字节顺序),默认读取16进制数据
Nunsigned long (always 32 bit, big endian byte order)
无符号长整型格式(每次格32位,以低端地址存放高位数据顺序),默认读取16进制数据
Vunsigned long (always 32 bit, little endian byte order)
无符号长整型格式(每次格32位,以低端地址存放低位数据顺序),默认读取16进制数据
ffloat (machine dependent size and representation)
单精度实型格式(取决于机器的最大寻址位数和表示)
ddouble (machine dependent size and representation)
双精度实型格式(取决于机器的最大寻址位数和表示)
xNUL byte
XBack up one byte
@NUL-fill to absolute position


下面以具体的例子来讲解一下每个参数的用法:

echo pack("a", 0x41);  //输出6

将一个十六进制数据0x41以十进制的方式读取,0x41转换成十进制是65,取一位返回就是6

echo pack("a2", 0x41);  //输出65

此代码为取两位返回为65


echo pack("H2", 0x41);  //输出e

将一个十六进制数据0x41以十进制的方式读取,由于H是每次格4位,这里用了H2,代表格8位,由于高位在前,0x41转换成十进制是65,65被H2格式化之后是0X65,转换成ASC码是e


echo pack("c", 0x41);  //输出A

0x41是十六进制的数据,所以经过c格式化之后是0x41,转换成ASC码是A

echo pack("c", 65);  //输出A

将十进制数据65以十六进制的方式读取,65转换成十六进制是0x41,然后经过c格式化,转换成ASC码是A


echo pack("s", 0x4143424445);   //输出ED

十六进制数据0x4143424445,经过s格式化,由于是按计算机字节的循序,所以从低位数据开始,格式化16位,返回0x45,0x44,转换成ASC码是ED


关于低位地址存放高位数据

数据:0x4143424445

位置:高位   <--   低位

因为低端地址存放高端数据,41是最高端有效数据,所以存放在最低端地址,顺序为:

数据:41   43   42   44   45

位置:低端地址->高端地址


echo pack("n", 0x4143424445);  //输出DE

将0x4143424445以十六进制方式读取,然后经过n格式化,由于是按照以低端地址存放高位数据顺序方式,格16位数据,返回0x44,0x45, 转换成ASC码是DE


echo pack("v", 0x4143424445);  //输出ED

将0x4143424445以十六进制方式读取,然后经过v格式化,由于是按照以低端地址存放低位数据顺序方式,格16位数据,返回0x45,0x44, 转换成ASC码是ED


echo pack("i", 0x4143424445);  //输出EDBC

将0x4143424445以十六进制方式读取,然后经过i格式化,由于xp系统的最大寻址位数是32位,所以格32位数据并以计算机字节顺序,返回0x45,0x44,0x42,0x43,转换成ASC码是EDBC


echo pack("l", 0x4143424445);  //输出EDBC

过程同s,这里是格式化32位数据字节,所以返回EDBC


echo pack("N", 0x4143424445);  //输出CBDE

过程同n,这里同样格式化32位数据字节,返回CBDE


对于pack,如果提供的数据不是format默认读取的数据进制,则会先转换为相应的数据进制,再进行打包操作


unpack ( string $format , string $data )
将获取到的二进制数据流解包,format参数同pack()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值