详谈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 相关文章推荐
生成sessionid和随机密码的例子
Oct 09 PHP
php网站来路获取代码(针对搜索引擎)
Jun 08 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
php基于websocket搭建简易聊天室实践
Oct 24 PHP
php实现的中文分词类完整实例
Feb 06 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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作为数据库? Mysql 创建用户方法
2007/07/02 PHP
Chrome Web App开发小结
2014/09/04 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Bootstrap table使用方法记录
2017/08/23 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
python缩进区别分析
2014/02/15 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
pytorch之添加BN的实现
2020/01/06 Python
python 回溯法模板详解
2020/02/26 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
设计顾问服务计划书
2014/05/04 职场文书
2014组织生活会方案
2014/05/19 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis