今天看啥
热点:

今天帮客之家就带大家来了解下IP地址和整型之间的转换方法问题,说说那些有关ip地址和整型的转换的经验

 

IP地址转换为整型

 

1.使用php的ip2long() 和 long2ip() 函数转换IP地址为整型

 

使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。www.bkjia.com

 

<?php
$strIp = '202.105.77.179';
$numIp = ip2long($strIp);

echo $numIp . '<br>';
echo long2ip($numIp);

输出结果:

 

 

-899068493
202.105.77.179

可以看到IP地址转换为整型后变成了负数,这其实是因为转换后超出了数据类型范围造成的。

 

【造成原因】:Because PHP's integer type is signed, and many IP addresses will result in negative integers.

【解决办法】:其官方手册中提到,可以"you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned IP address"

即,printf( '%u', ip2long( 'IP地址' ) ),或者将其先转换为二进制然后在转换为十进制,bindec( decbin( ip2long( 'IP地址' ) ) );

 

<?php
$strIp = '202.105.77.179';

//方法1:
printf('%u', ip2long($strIp));

//方法2:
$numIp = bindec(decbin(ip2long($strIp)));

echo '<br>' . $numIp;

输出结果:

3395898803
3395898803

以下内容摘自网络:

 

把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函数仍能得到正确的结果.

 

IP地址转化为整型的方法二

将一个Ip地址转换成整形

//接受一个String类型的一个参数,将其转化成一个long类型的
//暂时转化String类型的IP地址
 public long ipToLong(String ip){
  String[] ips = ip.split("//.");
  StringBuffer strip = new StringBuffer();
  for(int i=0;i

 

当发生 192.168.12.1和192.168.1.21的时候用上面的那种转换的话,结果是相同的:192168121 所以有下面两种方式:

第一种: id分为四段,每段不够3位的话,加零如:192.168.12.1和192.168.1.21,结果是:192168012001和192168001021

package com.text.dos;
 
import org.omg.PortableInterceptor.DISCARDING;
 
public class Test {
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO 自动生成方法存根
  
  String s = "192.168.1.12";
  long j = doString(s);
  System.out.println(j);
 }
 
 private static long doString(String idString)
 {
  long i = 0;
  int a1 = idString.indexOf(".");
  int a2 = idString.indexOf(".",a1+1);
  int a3 = idString.indexOf(".",a2+1);
  
 
  String s1 = idString.substring(0,a1);
  String s2 = idString.substring(a1+1,a2);
  String s3 = idString.substring(a2+1, a3);
  String s4 = idString.substring(a3+1,idString.length());
  //System.out.println(s4);
  
  if(s1.length()==1)
   s1 = "00"+s1;
  else if (s1.length()==2) {
   s1 = "0"+s1;
  }
  System.out.println(s1);
  
  if(s2.length()==1)
   s2 = "00"+s2;
  else if (s2.length()==2) {
   s2 = "0"+s2;
  }
  System.out.println(s2);
  
  if(s3.length()==1)
   s3 = "00"+s3;
  else if (s3.length()==2) {
   s3 = "0"+s3;
  }
  if(s4.length()==1)
   s4 = "00"+s4;
  else if (s4.length()==2) {
   s4 = "0"+s4;
  }
  
  System.out.println(s3);
  String s = s1+s2+s3+s4;
  i = Long.parseLong(s);
  
  
  return i;
 }
 
}

第二种:

一、应用范围一般用在登录限制、查找IP所在城市等需求中,windows的ping命令也支持整数形式的IP。

二、关键技术点将IP地址转化成整数的方法如下: 1、通过String的indexOf方法找出IP字符串中的点"."的位置。 2、根据点的位置,使用String的substring方法把IP字符串分成4段。 3、使用Long的parseLong方法把子段转化成一个3位整数。 4、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1 将整数形式的IP地址转化成字符串的方法如下: 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。

三、实例演示

	public class IP2Long ...{

	

	//将127.0.0.1形式的IP地址转换成十进制整数,这里没有进行任何错误处理

	public static long ipToLong(String strIp) ...{

	long[] ip = new long[4];

	//先找到IP地址字符串中.的位置

	int position1 = strIp.indexOf(".");

	int position2 = strIp.indexOf(".", position1 + 1);

	int position3 = strIp.indexOf(".", position2 + 1);

	//将每个.之间的字符串转换成整型

	ip[0] = Long.parseLong(strIp.substring(0, position1));

	ip[1] = Long.parseLong(strIp.substring(position1+1, position2));

	ip[2] = Long.parseLong(strIp.substring(position2+1, position3));

	ip[3] = Long.parseLong(strIp.substring(position3+1));

	return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];

	}

	

	//将十进制整数形式转换成127.0.0.1形式的ip地址

	public static String longToIP(long longIp) ...{

	StringBuffer sb = new StringBuffer("");

	//直接右移24位

	sb.append(String.valueOf((longIp >>> 24)));

	sb.append(".");

	//将高8位置0,然后右移16位

	sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));

	sb.append(".");

	//将高16位置0,然后右移8位

	sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));

	sb.append(".");

	//将高24位置0

	sb.append(String.valueOf((longIp & 0x000000FF)));

	return sb.toString();

	}

	/** *//**

	* @param args

	*/

	public static void main(String[] args) ...{

	String ipStr = "192.168.0.1";

	long longIp = IP2Long.ipToLong(ipStr);

	System.out.println("192.168.0.1 的整数形式为:" + longIp);

	System.out.println("整数" + longIp + "转化成字符串IP地址:"

	+ IP2Long.longToIP(longIp));

	//ip地址转化成二进制形式输出

	System.out.println("192.168.0.1 的二进制形式为:" + Long.toBinaryString(longIp));

	

	}

	}

 

 

IP地址转化为整型方法三

 

Converts a string ip address ("192.168.0.1") to a Long number (3232235521). One of the reasons to do this would be to store IP addresses in databases. Numbers greatly reduce the size required to store this information. 
Inputs: asNewIP - String IP address ("192.168.0.1") to convert to a number.

Returns: Returns a Long Integer representing the IP address (3232235521)

Assumes: This function assumes that your IP address has 4 integers delimited by decimals and that the numbers range from 0 to 255.

Function CLngIP(ByVal asNewIP)
Dim lnResults
Dim lnIndex
Dim lnIpAry
' Split the IP address using the dot as a delimiter
lnIpAry = Split(asNewIP, ".", 4)
' Loop through Each number In the IP address
For lnIndex = 0 To 3

' If we are Not working With the last number...
If Not lnIndex = 3 Then

' Convert the number To a value range that can be parsed from the others
lnIpAry(lnIndex) = lnIpAry(lnIndex) * (256 ^ (3 - lnIndex))

End If

' Add the number To the results
lnResults = lnResults + lnIpAry(lnIndex)

Next
' If storing number within an Access Database,
' The variable Type "Long" ranges from -2147483648 To 2147483647
' You will need To subtract 2147483648 from the number
' before querying the database.

' lnResults = lnResults - 2147483648
' Return the results
CLngIP = lnResults
End Function 

整型转化为IP地址

Name: Convert LongIP to StringIP
Description: This function converts a Long Number (3232235521) into an IP Address ("192.168.0.1"). Why would you want to do this? Click here. 
Inputs: anNewIP - IP Address as a Long Number (no dots)

Returns: Returns the string representation of an IP Address ("192.168.0.1")

Function CStrIP(ByVal anNewIP)
Dim lsResults ' Results To be returned
Dim lnTemp ' Temporary value being parsed
Dim lnIndex ' Position of number being parsed
' If pulling number from an Access Database,
' The variable Type "Long" ranges from -2147483648 To 2147483647
' You will first need To add 2147483648 to the number to parse correctly.
' anNewIP = anNewIP + 2147483648
' Parse highest numbers first
For lnIndex = 3 To 0 Step -1

' Parse the current value For this position
lnTemp = Int(anNewIP / (256 ^ lnIndex))

' Append the number To the final results delimited by a dot
lsResults = lsResults & lnTemp & "."

' Remove the number that we just parsed
anNewIP = anNewIP - (lnTemp * (256 ^ lnIndex))

Next

' Cut off last dot
lsResults = Left(lsResults, Len(lsResults) - 1)

' Return the results
CStrIP = lsResults

End Function 

 

js操作ip地址和整型之间的转换

 

主要用于在js判断用户输入的一个ip段是否合法,如:192.168.1.11-192.168.1.134

//IP转成整型
function _ip2int(ip) 
{
    var num = 0;
    ip = ip.split(".");
    num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Number(ip[2]) * 256 + Number(ip[3]);
    num = num >>> 0;
    return num;
}

//整型解析为IP地址
function _int2iP(num) 
{
    var str;
    var tt = new Array();
    tt[0] = (num >>> 24) >>> 0;
    tt[1] = ((num << 8) >>> 24) >>> 0;
    tt[2] = (num << 16) >>> 24;
    tt[3] = (num << 24) >>> 24;
    str = String(tt[0]) + "." + String(tt[1]) + "." + String(tt[2]) + "." + String(tt[3]);
    return str;
}

function Test()
{
}
	

 

责任编辑(帮客鱼鱼)

评论暂时关闭