用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下:
包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容
1.包头的内容是记录帧内容的长度;
2. 加密:0表示不加密,1表示加密;
3. 命令码为服务端命令识别符号;
一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。
话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。
转摘的参数中文说明:
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 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置
分享到:
相关推荐
同时使用的易语言自带的 打开内存文件方法来进行组包,之前也咨询了论坛打开内存文件的方法可以存储一个G的文件,但是我们可能也用不到那么大,最多也就几百mb我估计就够用了。可能我的分包组包不是最高效的,但是...
一个实现socket发送和接收函数,很实用可以借鉴
socket编程中的常用函数,详细的函数说明
使用msdn虽然比较精确,但是对于英文不是很好,又想准确理解socket各类函数的使用,该资源里面的word文档记录了使用socket编程的各种函数中文说明,对于编写各种socket程序很有帮助。
Socket函数参考,Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考Socket函数参考...
该文档较为详细的解说了Socket编程基本的函数
socket通信相关函数
linux socket的select函数例子
如果socket中是使用的阻塞的方式来进行发送接收数据,肯定设计一个接收/发送数据超时的问题,设置的方式是使用setsocketopt函数来实现;这个就是个小例子
与socket有关的一些函数介绍
详细讲述了网络编程socket bind函数的使用说明
简单的测试socket函数程序 完成基本的网络通讯功能,可在局域网内收发信息
参考资料,很好的大全书.
windows_socket_api_函数大全
对socket函数进行了详细的解答,比较适合初学者。对socket函数进行了详细的解答,比较适合初学者。
Socket编程所有函数说明[详细],文档排版整齐。
C语言socket通讯 socketmessage
建立一个socket 函数: int socket(int domain, int type, int protocol); domain 指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP 协议族);type 参数指定socket 的类型:SOCK_STREAM 或SOCK_DGRAM...
这些 API适用于TCP/IP协议簇,支持 面向连接Stream (TCP) 及 面向无连接Datagram (UDP) Socket。