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
输出:
|
|