当前位置: 首页 > news >正文

IP转换整形(ip2long)

为什么80%的码农都做不了架构师?>>>   hot3.png

如何将四个字段以点分开的IP网络址协议地址转换成整数呢?PHP里有这么一个函数ip2long.比如 
<?php 
echo ip2long("10.2.1.3"); 
?> 
我们将得到 
167903491 

这是如何计算的,目前我知道有两个算法。其一 
<?php 
function ip2int($ip){ 
   //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256 
   //这即是我们得到的值 
   return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4; 

?> 

其二,用位运算 
<?php 
function ip2int($ip){ 
   list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip); 
   return ($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4); 

?> 

我们会发现,有些ip转化成整数后,是负的,这是因为得到的结果是有符号整型,最大值是2147483647.要把它转化为无符号的,可以用 
sprintf("%u",ip2long($ip); 

就能转换为正整数。而且得到的结果用long2ip也可以正常转换回原来的ip地址。也可以用ip2long来验证一个ip是否是有效的,如 
<?php 
function chk_ip($ip){ 
   if(ip2long($ip)=="-1") { 
      return false; 
   } 
   return true; 

//应用 
var_export(chk_ip("10.111.149.42")); 
var_export(chk_ip("10.111.256.42")); 
?> 
将输出true和false 

转自http://blog.csdn.net/wztgq/archive/2005/06/28/406662.aspx


把ip数据保存在数据库(MySQL)中时候,我们习惯用ip2long函数生成整型,然后存放在一个int(11)类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据,用long2ip得到ip的时候产生错误,说一下我们碰到的情况:
我们用一个int(11)类型(范围-2147483648 - 2147483647)来保存把一个ip地址用ip2long处理得到的结果,例如ip是’202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803.然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址.
解决的办法很多,比如可以用mysql的函数:INET_ATON和INET_NTOA来处理ip地址;或者把保存ip地址的字段改为bigint类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结果.

转载于:https://my.oschina.net/netljx/blog/16048

相关文章:

  • vs2005 如何调试wince dll
  • RabbitMQ(二)队列与消息的持久化
  • 【敏捷开发实践】宣言与原则
  • Linux下有趣的命令
  • 让dedecms(织梦)的list标签支持weight排序
  • 翻译 tiobe发布2011年5月开发语言排名
  • 研磨设计模式笔记1
  • [zt]提问的艺术
  • Dell Latitude E6400找不到Broadcom USH及Contacted SmartCard驱动
  • mongodb内存映射存储引擎
  • poj2407
  • (十一)手动添加用户和文件的特殊权限
  • 日常使用频率很高的英语口语集锦
  • 时间问题导致Citrix License无法导入
  • js实现无限级树形导航列表
  • DOM的那些事
  • linux安装openssl、swoole等扩展的具体步骤
  • 分布式事物理论与实践
  • 工作中总结前端开发流程--vue项目
  • 欢迎参加第二届中国游戏开发者大会
  • 基于 Babel 的 npm 包最小化设置
  • 盘点那些不知名却常用的 Git 操作
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 手机app有了短信验证码还有没必要有图片验证码?
  • C# - 为值类型重定义相等性
  • 湖北分布式智能数据采集方法有哪些?
  • # Maven错误Error executing Maven
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (1)(1.11) SiK Radio v2(一)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)fiber的基本认识
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net6Api后台+uniapp导出Excel
  • .Net8 Blazor 尝鲜
  • .net操作Excel出错解决
  • .NET成年了,然后呢?
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @NestedConfigurationProperty 注解用法
  • [c语言]小课堂 day2
  • [HAOI2016]食物链
  • [LeetCode] Longest Common Prefix 字符串公有前序
  • [Machine Learning] 领域适应和迁移学习
  • [MZ test.16]P1 评测
  • [NHibernate]一对多关系(关联查询)
  • [NISACTF 2022]join-us
  • [NOIP2017 提高组] 列队 题解
  • [OGRE]看备注学编程(02):打地鼠01-布置场地九只地鼠
  • [Socket]Unix socket 运行权限问题
  • [SUCTF 2019]EasySQL1 题目分析与详解
  • [svc]ssh+gg二步认证
  • [svc]后台运行程序screen or nohup