php字节序转换的案例

  介绍

这篇文章主要介绍了php字节序转换的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

php字节序转换的方法:1、使用“htons”方法把无符号短类型从主机序转换到网络序;2、使用“htonl”把“无符号长”类型从主机序转换到网络序等。

 php字节序转换的案例

<强> php主机字节序和网络字节序

使用php编写插座程序时,也需要注意主机字节序和网络字节序的转换

主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序这个叫做主机序.Big-Endian和低位优先。引用标准的大端法和低位优先的定义如下:

)低位优先就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

b)高位优先就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

例子:在内存中双字0 x01020304字()的存储方式

内存地址   4000 4001 4002 4003   LE 04 03 02 01   是01 02年03 04

网络字节顺序是指TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型,操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。

为了进行转换bsd套接字提供了转换的函数有下面四个

htons把无符号短类型从主机序转换到网络序

htonl把无符号长类型从主机序转换到网络序

ntohs把无符号短类型从网络序转换到主机序

ntohl把无符号长类型从网络序转换到主机序

在使用小端字节序的系统中这些函数会把字节序进行转换

在使用big endian类型的系统中这些函数会定义成空宏

注意:

1,网络与主机字节转换函数:htons ntohs htonl ntohl (s就是短l是长h是主机n是网络)

2,不同的CPU上运行不同的操作系统,字节序也是不同的

在网络程序开发时或是跨平台开发时也应该注意保证只用一种字节序不然两方的解释不一样就会产生虫。

PHP中并没提供htons, htonl功能的函数,在进行网络通信时,可以通过

字符串包(字符串格式美元($ args[混合,混合美元……]])   unpack(字符串格式,美元字符串数组$ data)

进行编解码

其中,格式可以取下面的值:

代码描述   NUL-padded字符串   SPACE-padded字符串   h十六进制字符串,低先啃   H十六进制字符串,高先啃   c签署字符   C无符号字符   年代签署短(16位,机器字节顺序)   无符号短(16位,机器字节顺序)   n无符号短(16位,大端字节字节顺序)   v无符号短(总是16位,小端字节字节顺序)   我带符号整数(机器相关的大小和字节顺序)   我无符号整数(机器相关的大小和字节顺序)   l签署长(总是32位机器字节顺序)   L无符号长(总是32位机器字节顺序)   N无符号长(总是32位,大端字节字节顺序)   V无符号长(总是32位,小端字节字节顺序)   f浮动(机器相关的大小和表示)   d双(机器相关的大小和表示)   x空字节   X备份>字段字节数说明   包头定长每一个通信消息必须包含的内容   包体不定长根据每个通信消息的不同产生变化

其中包头详细内容如下:

字段字节数类型说明   pkg_len 2 ushort整个包的长度,不超过4 k   版本1 uchar通讯协议版本号   command_id 2 ushort消息命令ID   结果2短请求时不起作用,请求返回时使用

当然实际中可能会涉及到各种校验。本文为了简单,只是列举一下通常的工作流程及处理的方式。

登录(执行命储1001)

字段字节数类型说明   用户名30 uchar[30]登录用户名   密码32 uchar[32]登录密码

包头是定长的,通过计算可知包头占7个字节,并且包头在包体之前,比如用户陈一回需要登录,密码是123456,则代码如下:

& lt; php ?   $ version=1;   结果美元=0;   command_id=1001美元;   $ username=俺乱换亍?   密码=美元md5 (“123456”);//构造包体   $ bin_body=包(“a30a32",美元用户名、密码)美元;//包体长度   美元body_len=strlen (bin_body美元);   $ bin_head=包(“nCns" body_len美元,美元版本,command_id美元,美元的结果);//结果为什么使用了主机字节序   bin_data=https://www.yisu.com/zixun/bin_head美元。bin_body美元;//发送数据//socket_write(插座,bin_data美元strlen (bin_data美元));//socket_close(插座);

php字节序转换的案例