PHP和MySQL 实现IP地址和十进制数字互转

一、PHP IP地址和十进制数字互转

http://blog.csdn.net/iua1024/article/details/5145963

IPV4 可以看做4个256进制的数字, 可以按常规的进制转换换算成十进制.

如 192.168.1.1 换算成10进制:

192*256*256*256 + 168*256*256+1*256+1

 其实计算机更擅长移位和与或运算. 可以改进算法如下.

 IP 转长整型

[c-sharp]  view plain copy
  1. public ipToInt($sIP)  
  2. {  
  3.     $aIP = explode('.',$sIP);  
  4.     $iIP = ($aIP[0] << 24) | ($aIP[1] << 16) | ($aIP[2] << 8) | $aIP[3]  
  5.     if($iIP < 0) $iIP += 4294967296;  
  6.     return $iIP;  
  7. }  

 整型转 IP:

[c-sharp]  view plain copy
  1. function intToIP($iIP)  
  2. {  
  3.     $xor = array(0x000000ff,0x0000ff00,0x00ff0000,0xff000000);  
  4.     for($i=0; $i<4; $i++)  
  5.     {  
  6.         ${'s'.$i} = ($iIP & $xor[$i]) >> $i*8;
         if  (${ 's'  .$i} < 0) ${ 's' .$i} += 256;
  7.     }  
  8.     return $s3.'.'.$s2.'.'.$s1.'.'.$s0;  
  9. }  


二、MySQL IP地址和十进制数字互转


这篇文章没什么技术含量, 主要介绍两个 mysql函数,  INET_ATON() 将IP转为十进制数字, INET_NTOA()将数字转换为IP。

    先来看IP的结构, 127.0.0.1  ,学计算机的对2的N次方比较敏感,一看就猜到是由 4个8位的二进制数字组成, 对, 就是这样!也就是说IP转换成二进制可以这样: 

1 select concat(bin(127),lpad(bin(0),8,0),lpad(bin(0),8,0),lpad(bin(1),8,0));
    把每一位的前边补0, 然后拼接起来,得到这样的结果: 1111111000000000000000000000001 

    系统的INET_ATON()函数也是这么算的,不信可以对比一下结果:

1 select bin(inet_aton('127.0.0.1'));

    得到的结果也是这样:  1111111000000000000000000000001 

    所以得出结论: INET_ATON() 就是把IP的每一段转为二进制拼接起来,然后将这个32位的二进制数字转为10进制

示例:

1 select INET_ATON('127.0.0.1');  --转为数字
2 select INET_NTOA(2130706433); --转为IP
    为什么这么存储呢? 

    有人说节省空间, 也对, 不过比较蛋疼, 现在的硬盘那么便宜在乎这点空间? 

    更为合理的解释是, 方便查询, 比如要查某一网段的所有IP就可以 :

1 select * from table where ip between inet_aton('192.168.0.1') and inet_aton('192.168.0.255');


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值