详谈php ip2long 出现负数的原因及解决方法


Posted in PHP onApril 05, 2017

php提供了ip2long与long2ip方法对ip地址处理。

1、ip2long — 将一个IPV4的字符串互联网协议转换成数字格式

int ip2long ( string $ip_address )

参数: ip_address 一个标准格式的地址。

返回值: 返回IP地址转换后的数字 或 FALSE 如果 ip_address 是无效的。

2、long2ip — 将数字格式转换成一个IPV4的字符串互联网协议

string long2ip ( string $proper_address )

参数: proper_address 长整型的正确地址表示。

返回值: 返回互联网地址作为字符串。

3、使用方法

<?php
$ip = '10.1.1.1';
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // 167837953
echo long2ip($ip_long); // 10.1.1.1
?>

4、出现负数原因及处理方法

当ip地址比较大时,ip2long会出现负数:

<?php
$ip = '192.168.101.100';
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // -1062705820
echo long2ip($ip_long); // 192.168.101.100
?>

原因说明:

IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址。书写用4个小数点分开的10进制数。

记为A.B.C.D,例如:192.168.100.100。

IPv4地址每个10进制数都是无符号的字节,范围在0~255,将IPv4地址转为无符号数,其实就是将每个10进制数放在对应的8位上,组成一个4字节的无符号整型。192.168.100.100,192,168在高8位100,100在低8位。

C实现的例子:

#include <stdio.h>

int main(int argc, char** argv)
{
  unsigned int ip_long = (192 << 24) | (168 << 16) | (100 << 8) | 100;
  printf("%u\n", ip_long);
  printf("%d\n", ip_long);

  return 0;
}

fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c
fdipzone@ubuntu:~/C$ ./ip2long
3232261220
-1062706076

可以看到,即使ip_long声明是无符号整型,输出时依然需要指明%u来格式化输出为无符号整型。

因为192大于127(二进制为01111111),192(8位)用二进制表示,最高位必然是1。导致这个4字节整型的最高位为1。

虽然ip_long定义为无符号整型,但printf方法是不理会声明的。所以需要使用%u格式化来输出。如果最高位是0,则使用%d即可。

另一个例子:

ip:112.24.55.99

#include <stdio.h>

int main(int argc, char** argv)
{
  unsigned int ip_long = (112 << 24) | (24 << 16) | (55 << 8) | 99;
  printf("%u\n", ip_long);
  printf("%d\n", ip_long);

  return 0;
}
fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c
fdipzone@ubuntu:~/C$ ./ip2long
1880635235
1880635235

解决方法:

输出时用%u来格式化为无符号整型。

<?php
$ip = '192.168.101.100';
$ip_long = sprintf('%u',ip2long($ip));
echo $ip_long.PHP_EOL; // 3232261476 
echo long2ip($ip_long); // 192.168.101.100
?>

以上这篇详谈php ip2long 出现负数的原因及解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
基于PHP array数组的教程详解
Jun 05 PHP
php获取目录所有文件并将结果保存到数组(实例)
Oct 25 PHP
一个简单且很好用的php分页类
Oct 26 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
php生成0~1随机小数的方法(必看)
Apr 05 #PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 #PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 #PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 #PHP
php 判断页面或图片是否经过gzip压缩的方法
Apr 05 #PHP
通过php动态传数据到highcharts
Apr 05 #PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 #PHP
You might like
Protoss热键控制
2020/03/14 星际争霸
jqgrid 表格数据导出实例
2013/11/21 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
详解Vuex中mapState的具体用法
2017/09/28 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
记一次vue跨域的解决
2020/10/21 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
对Python3 序列解包详解
2019/02/16 Python
Python中正则表达式的用法总结
2019/02/22 Python
使用pandas读取文件的实现
2019/07/31 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
药店促销活动总结
2014/07/10 职场文书
2014年国庆节寄语
2014/09/19 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
三好学生评语大全
2014/12/29 职场文书
2015年财务部工作总结
2015/04/10 职场文书
步步惊心观后感
2015/06/12 职场文书