详谈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中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
PHP7创建销毁session的实例方法
Feb 03 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中3种方法删除字符串中间的空格
2014/03/10 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
JavaScript多线程详解
2015/08/12 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
python3生成随机数实例
2014/10/20 Python
python实现将文本转换成语音的方法
2015/05/28 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python实现简易学生信息管理系统
2020/04/05 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python -v 报错问题的解决方法
2020/09/15 Python
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
机械设计及其自动化专业推荐信
2013/10/31 职场文书
电子信息毕业生自荐信
2013/11/16 职场文书
优秀员工自荐书
2013/12/19 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
教师自荐信范文
2015/03/06 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书