IP的网络字节序

TCP/IP统一规定使用大端方式传输数据,也称为网络字节顺序。

1、c里面的inet_addr返回的是网络字节序

2、mysql的inet_aton返回的是主机字节序,其手册上说是网络字节序是不对的

3、php的long2ip接收的参数是无符号的主机字节序

4、php中没有提供网络字节序和主机字节序之间的转换,可以用以下代码将网络字节序地址转成点分十进制格式

// 192.168.5.242的网络字节序
$pi = 4060457152;// 注意不要用intval($pi)转换,对int还可以,如果值超过int,就溢出了
// 获取网络字节序的二进制表示,其中“N”表示按大头序(网络字节序)逐一得到$pi的四个字节
$binarydata = pack("N", $pi);

// 可以写到文件中,用十六进制编辑器查看得到的四个字节的二进制
//$fp = fopen('text.txt', 'w');
//fwrite($fp, $binarydata);
//fclose($fp);

// 'L'表示按主机字节序对二进制数据$binarydata进行字节重新编排以获取整数
$arr = unpack('L', $binarydata);
// php文档中说'L'得到是无符号整数,是错误的, 实际得到的是有符号数,需要用下面的代码进行转换
$u = (float)sprintf("%u", $arr[1]);
// 把无符号主机字节序整数转换成电分十进制格式
$ip = long2ip($u);
// 输出192.168.5.242
echo $ip;


另外还有一种简单的方式是

//$pi是网络字节序
$ip = long2ip($pi);
// 把转换的结果调换一下顺序
$tmpip = explode('.',$ip);
$ip = $tmpip[3].'.'.$tmpip[2].'.'.$tmpip[1].'.'.$tmpip[0];



你可能感兴趣的:(PHP,网络技术)