详谈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 友好URL的实现(吐血推荐)
Oct 04 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php递归方法实现无限分类实例代码
Feb 28 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
php cookie工作原理与实例详解
Jul 18 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
php根据年月获取季度的方法
2014/03/31 PHP
php写的AES加密解密类分享
2014/06/20 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
jQuery技巧总结
2011/01/01 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python求列表交集的方法汇总
2014/11/10 Python
python登陆asp网站页面的实现代码
2015/01/14 Python
python根据日期返回星期几的方法
2015/07/06 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
毕业生造价工程师求职信
2013/10/17 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
建筑工地文明标语
2014/10/09 职场文书
解放思想大讨论活动总结
2015/05/09 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
Win11查看设备管理器
2022/04/19 数码科技