详谈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 和 XML: 使用expat函数(三)
Oct 09 PHP
ASP和PHP都是可以删除自身的
Apr 09 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
Apache服务器无法使用的解决方法
May 08 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
php中使用url传递数组的方法
Feb 11 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
Yii2中datetime类的使用
Dec 17 PHP
php微信开发之关键词回复功能
Jun 13 PHP
thinkPHP实现基于ajax的评论回复功能
Jun 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位运算的简单权限设计
2013/06/30 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
javascript日期格式化示例分享
2014/03/05 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Python 使用多属性来进行排序
2019/09/01 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
Python Json数据文件操作原理解析
2020/05/09 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
银行职员个人的工作自我评价
2014/02/15 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
个人综合鉴定材料
2014/05/23 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
捐书仪式主持词
2015/07/04 职场文书