详谈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如何得到当前页和上一页的地址?
Nov 27 PHP
一个捕获函数输出的函数
Feb 14 PHP
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
网站用php实现paypal整合方法
Nov 28 PHP
php URL跳转代码 减少外链
Jun 25 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
php格式化电话号码的方法
Apr 24 PHP
yii用户注册表单验证实例
Dec 26 PHP
php数据访问之增删改查操作
May 09 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
详解php命令注入攻击
2019/04/06 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
python 字符串split的用法分享
2013/03/23 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
Python API自动化框架总结
2019/11/12 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
如何利用Python识别图片中的文字
2020/05/31 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
工程造价与管理专业应届生求职信
2013/11/23 职场文书
班主任工作年限证明
2014/01/12 职场文书
争先创优心得体会
2014/09/12 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
ORACLE查看当前账号的相关信息
2021/06/18 Oracle