PHP实现IP–数字互相转换

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>第一php网提供的教程--PHP实现IP--数字互相转换</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

</head>

<body>

<?php

/*

* 作者:XXXX

*/

//将IP转换为数字

function ipton($ip)

{

$ip_arr=explode(‘.‘,$ip);//分隔ip段

foreach ($ip_arr as $value)

{

$iphex=dechex($value);//将每段ip转换成16进制

if(strlen($iphex)<2)//255的16进制表示是ff,所以每段ip的16进制长度不会超过2

{

$iphex=‘0‘.$iphex;//如果转换后的16进制数长度小于2,在其前面加一个0

//没有长度为2,且第一位是0的16进制表示,这是为了在将数字转换成ip时,好处理

}

$ipstr.=$iphex;//将四段IP的16进制数连接起来,得到一个16进制字符串,长度为8

}

return hexdec($ipstr);//将16进制字符串转换成10进制,得到ip的数字表示

}

//将数字转换为IP,进行上面函数的逆向过程

function ntoip($n)

{

$iphex=dechex($n);//将10进制数字转换成16进制

$len=strlen($iphex);//得到16进制字符串的长度

if(strlen($iphex)<8)

{

$iphex=‘0‘.$iphex;//如果长度小于8,在最前面加0

$len=strlen($iphex); //重新得到16进制字符串的长度

}

//这是因为ipton函数得到的16进制字符串,如果第一位为0,在转换成数字后,是不会显示的

//所以,如果长度小于8,肯定要把第一位的0加上去

//为什么一定是第一位的0呢,因为在ipton函数中,后面各段加的‘0‘都在中间,转换成数字后,不会消失

for($i=0,$j=0;$j<$len;$i=$i+1,$j=$j+2)

{//循环截取16进制字符串,每次截取2个长度

$ippart=substr($iphex,$j,2);//得到每段IP所对应的16进制数

$fipart=substr($ippart,0,1);//截取16进制数的第一位

if($fipart==‘0‘)

{//如果第一位为0,说明原数只有1位

$ippart=substr($ippart,1,1);//将0截取掉

}

$ip[]=hexdec($ippart);//将每段16进制数转换成对应的10进制数,即IP各段的值

}

$ip = array_reverse($ip);

return implode(‘.‘, $ip);//连接各段,返回原IP值

}

echo ipton(‘119.255.31.226‘);

echo ‘<br>‘;

$num=‘379374783‘;

echo strlen($num).‘<br/>‘;

echo ntoip($num).‘<br/>‘;

echo ‘trueipnum:‘.ip2long(‘119.255.31.226‘).‘<br/>‘;

echo ‘trueip:‘.long2ip(‘3793747831‘);

?>

</body>

</html>

  

mysql自带了inet_aton函数来实现将ip地址转换为数字,inet_ntoa函数将数字转换为ip。

SELECT INET_ATON( ‘10.122.22.1‘ )

上面的转换函数为站长原创,碰巧实现了跟mysql系统函数相同的转换效果,呵呵,兴奋好久~~

原来PHP提供了ip2long和long2ip2个函数来实现IP与数字的转换,站长做了无用功了,不过权当锻炼逻辑思维吧~~

这是两种实现方法,一种是在程序上实现;一种是直接在sql语句中实现,很方便,不错,保存下来了,发到自己的博客,以后就不会忘记了。

把ip数据保存在数据库(MySQL)中时候,我们习惯用ip2long函数生成整型,然后存放在一个int(11)类型的字段中,但是,在不同的系统平台上,ip2long函数得到的值是不同的,因此可能造成在从数据库中读出数据,用long2ip得到ip的时候产生错误,说一下我们碰到的情况:

我们用一个int(11)类型(范围-2147483648 - 2147483647)来保存把一个ip地址用ip2long处理得到的结果,例如ip是’202.105.77.179′,那么在32位机器上得到的结果是:-899068493,而在64位机器上却得到3395898803.然后把它写入数据库,由于超过int(11)的范围,因此64位机器上的结果被保存为int(11)的最大值:2147483647.于是在从数据库中取出的时候,便得到了错误的结果,会得到”127.255.255.255″这个ip地址.

解决的办法很多,比如可以用mysql的函数:INET_ATON和INET_NTOA来处理ip地址;或者把保存ip地址的字段改为bigint类型,这样在64位机器上虽然保存的是3395898803,使用long2ip函数仍能得到正确的结

时间: 2024-11-11 18:48:37

PHP实现IP–数字互相转换的相关文章

【C语言】将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)

#include <stdio.h> /* 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数.负浮点数) 例如:"12.34" 返回12.34 "-123.34" 返回-123.34 函数原型:double my_atof(char *str) {} */ double my_atof(char *str) { double m=0,n=0,x=1; int flag=1; int flag2=0; if(*str=='-') //

【C语言】编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数、负整数)

/* 编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数.负整数) 例如:"12" 返回12 "-123" 返回-123 函数原型:int my_atof(char *str) */ #include <stdio.h> int my_atof(char *str) { int flag=0; int m=0; if(*str=='-') { flag=1; str++; } while(*str!='\0') { if(*str<

将整形数字(int)转换成字符串

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<string.h> void itoa(int n, char *buf) { int count = 0; char nu; char buf2[128] = { 0 }; //核心算法很简单 就是每次取出各位数字然后把数字转存进数组,中间有一个数组匿置的过程 do

PHP算法--将数字金额转换成大写金额

最近在看一些PHP算法题,遇到一个将数字金额转换成大写金额的小算法题,这里贴出自己的一个例子. 注:这个小算法适用于10万以内的金额. <?php //$num = 12345.67; function RMB_Upper($num) { $num = round($num,2); //取两位小数 $num = ''.$num; //转换成数字 $arr = explode('.',$num); $str_left = $arr[0]; // 12345 $str_right = $arr[1]

铁通网络没有一个真实的公网IP,NAT转换能不能解决?

铁通网络没有一个真实的公网IP,NAT转换能不能解决? 我的是铁通宽带,现在想用自己的机子做一个动态主机,可是因为铁通垃圾网络的NAT转发问题,使用cn99qdns手动更新动态域名IP后公网能解析域名,但无法访问我的机子也无法ping通,这个问题谁帮我解决啊,谢谢哈.问题解决了之后另有重赏. 你首先确认你是否拥有外网IP.铁通有部分用户是共享上网,几百户一个共享一个外网IP. 现在的路由器上一般都有DMZ设置,你把你要对外网开放的主机设置成DMZ,即可PING通了. 到工信部网站http://w

点分十进制IP校验、转换,掩码校验

/***************************************************************************** * 点分十进制IP校验.转换,掩码校验 * 声明: * 本文主要记录如何对IP.掩码进行转换.校验等相关内容. * * 2016-5-5 深圳 南山平山村 曾剑锋 ****************************************************************************/ 一.参考文档: 1.

数字如何转换成ASCII码字符——谭浩强C课后题4.9

原题如下: 练习4.9  给一个不多于5位的正整数,求 1.它是几位数: 2.分别输出每一位数字: 3.倒序输出各位数字. 思考:1.要求输入为不多于5位的正整数 2.要取出5位中每位的数字 3.要能辨认出前几位的数字0来判断到底是几位数 在取得每位的数字然后转换成ASCII码字符时候,犯了错误. 错误代码为:     A=(char)k/10000; k=k%10000;     B=(char)k/1000; k=k%1000;     C=(char)k/100; k=k%100;    

C语言 将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数 函数原型:double my_atof(char *str)

编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数.负浮点数) 例如:"12.34"  返回12.34 "-123.34" 返回-123.34 函数原型:doublemy_atof(char *str) 提示: 需要在函数中判断负号,小数点,还要判断是不是数字字符.在判断小数点时需定义一个计数器来计算小数点后数字字符的个数. #include <stdio.h> #include <math.h> double my_at

【C语言】数字字符串转换成这个字符串对应的数字。

(1) int ascii_to_integer(char *str)函数实现. 要求:这个字符串参数必须包含一个或者多个数字,函数应该把这些数字转换为整数并且返回这个整数.如果字符串参数包含任何非数字字符,函数就返回零.不必担心算数溢出. 提示:你每发现一个数字,把当前值乘以10,并把这个值和新的数字所代表的值相加. 直接上代码: #include <stdio.h> #include <assert.h> int ascii_to_integer(char *str) { in