详谈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+Mysql+jQuery实现动态展示信息
Oct 08 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
JavaScript Accessor实现说明
2010/12/06 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
Vue实现日历小插件
2019/06/26 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
python encode和decode的妙用
2009/09/02 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
用Python生成器实现微线程编程的教程
2015/04/13 Python
python中xrange用法分析
2015/04/15 Python
python设计模式大全
2016/06/27 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
Python super()函数使用及多重继承
2020/05/06 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
自动化毕业生专业自荐书范文
2014/02/04 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
运动会广播稿20字
2015/08/19 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android