php通过pack和unpack函数实现对二进制数据封装及解析,php通过pack和unpack函数实现对二进制数据封装及解析...

1. pack和unpack格式字符串解析:

a一个填充空的字节串

A一个填充空格的字节串

b一个位串,在每个字节里位的顺序都是升序

B一个位串,在每个字节里位的顺序都是降序

c一个有符号char(8位整数)值

C一个无符号char(8位整数)值;关于Unicode参阅U

d本机格式的双精度浮点数

f本机格式的单精度浮点数

h一个十六进制串,低四位在前

H一个十六进制串,高四位在前

i一个有符号整数值,本机格式

I一个无符号整数值,本机格式

l一个有符号长整形,总是32位

L一个无符号长整形,总是32位

n一个16位短整形,“网络”字节序(大头在前)

N一个32位短整形,“网络”字节序(大头在前)

p一个指向空结尾的字串的指针

P一个指向定长字串的指针

q一个有符号四倍(64位整数)值

Q一个无符号四倍(64位整数)值

s一个有符号短整数值,总是16位

S一个无符号短整数值,总是16位,字节序跟机器芯片有关

u一个无编码的字串

U一个Unicode字符数字

v一个“VAX”字节序(小头在前)的16位短整数

V一个“VAX”字节序(小头在前)的32位短整数

w一个BER压缩的整数

x一个空字节(向前忽略一个字节)

X备份一个字节

Z一个空结束的(和空填充的)字节串

规则:

(1).每个字母后面都可以跟着一个数字,表示count(计数,如果count是一个*表示剩下的所有东西。

(2)如果你提供的参数比$format要求的少,pack假设缺的都是空值。如果你提供的参数比$format要求的多,那么多余的参数被忽略。

2.php通过socket和java server通信

php跟java进行socket通讯的时候,php发送一段数据给java,(协议自定,这里假定类型10表示获取游戏邮件列表,10000表示获取的id)

java接受到后,会返回一段数据,从中获得你所需要的,比如java先告诉你返回内容规则如下:1 byte,2 int

php可以通过如下方式获得:

这样就完成一次解析过程.

这里我们都没有提到字符串的发送,我们知道字符串在字节流里的存储方式是前2个字节表示字符串的长度,后面表示字符串的具体内容(学过java的应该都了解),2个字节也就限制了发送长度最大为65536,因而我们要发送字符串需要如下(以下举例都在utf8下完成):

比如我们要向游戏服务器内发送一个公告:各位,服务器在1小时内重起!假设java要求这样的格式:协议号:int,标题,内容。我们就可以如下发送:

这样就完成一次发送.同样如果我们需要读取游戏服务器的数据,比如用户资料,也会返回字符串,原理同上,先读2个字节获取长度,再根据长度来获取具体的内容,代码如下:

$str就是我们要获取的中文,但是这样极其烦琐,如果有多个字符串的话,中间又包含了其他数据,比如返回为int,string,int,byte,string这样处理起来相当不便,于是提供下面的函数供大家参考:

需要注意的是:

(1)很多服务器都会用utf8编码的格式,所以我们的php文件也必须使用同样的编码,否则会出乱码,或其他问题

(2)该函数我只处理了4种类行,并且参数用java的类型代替了unpack原来的参数类型,如需处理其他类型,请自行修改。

2.其它举例:

例子1

输出:

例子 2

输出:

例子 3

输出:

169IT站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.

转载请注明:文章转载自:[169IT-最新最全的IT资讯]

本文标题:php通过pack和unpack函数实现对二进制数据封装及解析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值