详谈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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
php 生成饼图 三维饼图
Sep 28 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
基于PHP文件操作的详解
Jun 05 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 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使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
js 深拷贝函数
2008/12/04 Javascript
Cookie 注入是怎样产生的
2009/04/08 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
pytorch实现查看当前学习率
2020/06/24 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
文员自我评价怎么写
2013/09/19 职场文书
俄罗斯商务邀请函
2014/01/26 职场文书
瘦西湖导游词
2015/02/03 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
员工年度工作总结2015
2015/05/18 职场文书
初中物理教学反思
2016/02/19 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang