详谈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中文件上传的安全问题
Oct 09 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
PHP函数in_array()使用详解
Aug 20 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
dedecms集成财付通支付接口
Dec 28 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 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的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
Python使用requests发送POST请求实例代码
2018/01/25 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
python 写一个文件分发小程序
2020/12/05 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
在校大学生的职业生涯规划书
2014/03/14 职场文书
班主任寄语大全
2014/04/04 职场文书
英文推荐信格式范文
2014/05/09 职场文书
国际贸易实训报告
2014/11/05 职场文书
党员承诺书格式范文
2015/04/28 职场文书
公司承诺书格式范文
2015/04/28 职场文书
通讯稿格式及范文
2015/07/22 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android