`

Java中Ipv4与Ipv6的转换

阅读更多

IPConvert.java类的主要作用是将ip(ipv6\ipv4)转换成16个字节的数组,其中ipv4的转换是先将v4地址转换成v6再转换成长度是16的字节数组

 

package com.cvicse.naba.common.utils;

/**
 * 
 * 描述:
 * <p>
 * &nbsp;&nbsp;&nbsp;&nbsp;ip转换byte数组管理类。
 * </p>
 * 创建日期:2012-7-25 下午3:34:00<br>
 * 
 * @author:Wendy<br>
 * @update:$Date: 2012-07-25 18:14:40 +0800 (Wed, 25 Jul 2012) $<br>
 * @version:$Revision: 779 $<br>
 * @since 1.0.0
 */
public class IPConvert {
	private static final int IPV6Length = 8; // IPV6地址的分段
	private static final int IPV4Length = 4; // IPV6地址分段
	private static final int IPV4ParmLength = 2; // 一个IPV4分段占的长度
	private static final int IPV6ParmLength = 4; // 一个IPV6分段占的长

	/**
	 * IPV6、IPV4转化为十六进制串
	 * 
	 * @param ipAddress
	 * @return
	 */
	private static String buildKey(String ipAddress) {
		String Key = "";
		// ipv4标识 。判断是否是ipv4地址
		int dotFlag = ipAddress.indexOf(".");
		// ipv6标识 。判断是否是ipv6地址
		int colonFlag = ipAddress.indexOf(":");
		// ipv6标识 。判断是否是简写的ipv6地址
		int dColonFlag = ipAddress.indexOf("::");
		// 将v6或v4的分隔符用&代替
		ipAddress = ipAddress.replace(".", "&");
		ipAddress = ipAddress.replace(":", "&");
		// ipv4 address。将ipv4地址转换成16进制的形式
		if (dotFlag != -1 && colonFlag == -1) {
			String[] arr = ipAddress.split("&");
			// 1、 ipv4转ipv6,前4组数补0或f
			for (int i = 0; i < IPV6Length - IPV4ParmLength; i++) {
				// 根据v4转v6的形式,除第4组数补ffff外,前3组数补0000
				if (i == IPV6Length - IPV4ParmLength - 1) {
					Key += "ffff";
				} else {
					Key += "0000";
				}
			}
			// 2、将ipv4地址转成16进制
			for (int j = 0; j < IPV4Length; j++) {
				// 1)将每组ipv4地址转换成16进制
				arr[j] = Integer.toHexString(Integer.parseInt(arr[j]));
				// 2) 位数不足补0,ipv4地址中一组可转换成一个十六进制,两组数即可标识ipv6中的一组,v6中的一组数不足4位补0
				for (int k = 0; k < (IPV4ParmLength - arr[j].length()); k++) {
					Key += "0";
				}
				Key += arr[j];
			}
		}
		// Mixed address with ipv4 and ipv6。将v4与v6的混合地址转换成16进制的形式
		if (dotFlag != -1 && colonFlag != -1 && dColonFlag == -1) {
			String[] arr = ipAddress.split("&");

			for (int i = 0; i < IPV6Length - IPV4ParmLength; i++) {
				// 将ip地址中每组不足4位的补0
				for (int k = 0; k < (IPV6ParmLength - arr[i].length()); k++) {
					Key += "0";
				}
				Key += arr[i];
			}

			for (int j = 0; j < IPV4Length; j++) {
				arr[j] = Integer.toHexString(Integer.parseInt(arr[j]));
				for (int k = 0; k < (IPV4ParmLength - arr[j].length()); k++) {
					Key += "0";
				}
				Key += arr[j];
			}
		}
		// Mixed address with ipv4 and ipv6,and there are more than one
		// '0'。将v4与v6的混合地址(如::32:dc:192.168.62.174)转换成16进制的形式
		// address param
		if (dColonFlag != -1 && dotFlag != -1) {
			String[] arr = ipAddress.split("&");
			// 存放16进制的形式
			String[] arrParams = new String[IPV6Length + IPV4ParmLength];
			int indexFlag = 0;
			int pFlag = 0;
			// 1、将简写的ip地址补0
			// 如果ip地址中前面部分采用简写,做如下处理
			if ("".equals(arr[0])) {
				// 1)如果ip地址采用简写形式,不足位置补0,存放到arrParams中
				for (int j = 0; j < (IPV6Length + IPV4ParmLength - (arr.length - 2)); j++) {
					arrParams[j] = "0000";
					indexFlag++;
				}
				// 2)将已有值的部分(如32:dc:192.168.62.174)存放到arrParams中
				for (int i = 2; i < arr.length; i++) {
					arrParams[indexFlag] = arr[i];
					indexFlag++;
				}
			} else {
				for (int i = 0; i < arr.length; i++) {
					if ("".equals(arr[i])) {
						for (int j = 0; j < (IPV6Length + IPV4ParmLength
								- arr.length + 1); j++) {
							arrParams[indexFlag] = "0000";
							indexFlag++;
						}
					} else {
						arrParams[indexFlag] = arr[i];
						indexFlag++;
					}
				}
			}
			// 2、ip(去除ipv4的部分)中采用4位十六进制数表示一组数,将不足4位的十六进制数补0
			for (int i = 0; i < IPV6Length - IPV4ParmLength; i++) {
				// 如果arrParams[i]组数据不足4位,前补0
				for (int k = 0; k < (IPV6ParmLength - arrParams[i].length()); k++) {
					Key += "0";
				}
				Key += arrParams[i];
				// pFlag用于标识位置,主要用来标识ipv4地址的起始位
				pFlag++;
			}
			// 3、将ipv4地址转成16进制
			for (int j = 0; j < IPV4Length; j++) {
				// 1)将每组ipv4地址转换成16进制
				arrParams[pFlag] = Integer.toHexString(Integer
						.parseInt(arrParams[pFlag]));
				// 2)位数不足补0,ipv4地址中一组可转换成一个十六进制,两组数即可标识ipv6中的一组,v6中的一组数不足4位补0
				for (int k = 0; k < (IPV4ParmLength - arrParams[pFlag].length()); k++) {
					Key += "0";
				}
				Key += arrParams[pFlag];
				pFlag++;
			}
		}
		// ipv6 address。将ipv6地址转换成16进制
		if (dColonFlag == -1 && dotFlag == -1 && colonFlag != -1) {
			String[] arrParams = ipAddress.split("&");
			// 将v6地址转成十六进制
			for (int i = 0; i < IPV6Length; i++) {
				// 将ipv6地址中每组不足4位的补0
				for (int k = 0; k < (IPV6ParmLength - arrParams[i].length()); k++) {
					Key += "0";
				}

				Key += arrParams[i];
			}
		}

		if (dColonFlag != -1 && dotFlag == -1) {
			String[] arr = ipAddress.split("&");
			String[] arrParams = new String[IPV6Length];
			int indexFlag = 0;
			if ("".equals(arr[0])) {
				for (int j = 0; j < (IPV6Length - (arr.length - 2)); j++) {
					arrParams[j] = "0000";
					indexFlag++;
				}
				for (int i = 2; i < arr.length; i++) {
					arrParams[indexFlag] = arr[i];
					i++;
					indexFlag++;
				}
			} else {
				for (int i = 0; i < arr.length; i++) {
					if ("".equals(arr[i])) {
						for (int j = 0; j < (IPV6Length - arr.length + 1); j++) {
							arrParams[indexFlag] = "0000";
							indexFlag++;
						}
					} else {
						arrParams[indexFlag] = arr[i];
						indexFlag++;
					}
				}
			}
			for (int i = 0; i < IPV6Length; i++) {
				for (int k = 0; k < (IPV6ParmLength - arrParams[i].length()); k++) {
					Key += "0";
				}
				Key += arrParams[i];
			}
		}
		return Key;
	}

	/**
	 * 十六进制串转化为IP地址
	 * 
	 * @param key
	 * @return
	 */
	private static String splitKey(String key) {
		String IPV6Address = "";
		String IPAddress = "";
		String strKey = "";
		String ip1 = key.substring(0, 24);
		String tIP1 = ip1.replace("0000", "").trim();
		if (!"".equals(tIP1) && !"FFFF".equals(tIP1)) {
			// 将ip按:分隔
			while (!"".equals(key)) {
				strKey = key.substring(0, 4);
				key = key.substring(4);
				if ("".equals(IPV6Address)) {
					IPV6Address = strKey;
				} else {
					IPV6Address += ":" + strKey;
				}
			}
			IPAddress = IPV6Address;
		}
		return IPAddress;
	}

	/**
	 * 将ip地址都转成16个字节的数组。先将v6地址存以":"分隔存放到数组中,再将数组中的每两位取存到长度为16的字符串数组中,
	 * 再将这两位十六进制数转成十进制,再转成byte类型存放到16个字的数组中。
	 * 
	 * @param ip
	 * @return
	 */
	public static byte[] toByte(String ip) {
		// 将ip地址转换成16进制
		String Key = buildKey(ip);
		// 将16进制转换成ip地址
		String ip6 = splitKey(Key);

		// 将v6f地址存以":"分隔存放到数组中
		String[] ip6Str = ip6.split(":");
		String[] ipStr = new String[16];
		byte[] ip6Byte = new byte[16];

		// 将数组中的每两位取存到长度为16的字符串数组中
		for (int j = 0, i = 0; i < ip6Str.length; j = j + 2, i++) {
			ipStr[j] = ip6Str[i].substring(0, 2);
			ipStr[j + 1] = ip6Str[i].substring(2, 4);
		}

		// 将ipStr中的十六进制数转成十进制,再转成byte类型存放到16个字的数组中
		for (int i = 0; i < ip6Byte.length; i++) {
			ip6Byte[i] = (byte) Integer.parseInt(ipStr[i], 16);
		}
		return ip6Byte;
	}

}

 

 

分享到:
评论
3 楼 95546772 2015-12-17  
closer13 写道
请教,ipv6转为ipv4怎么搞?

2 楼 closer13 2015-10-13  
请教,ipv6转为ipv4怎么搞?
1 楼 明天的路由今天铺 2015-06-16  

相关推荐

    ipv4和ipv6字符串转换成数字

    #### IPv6转换为BigInteger 对于IPv6地址,代码通过`ipv6ToBytes`方法将其转换为字节数组。具体步骤如下: 1. 创建一个包含17个元素的字节数组,其中第一个元素设置为0,以确保高位为零。 2. 检查IPv6地址是否以冒号...

    Android手机IPV4和IPV6通信.rar

    在Android中,我们可以使用java.net.Socket类来创建和管理TCP/IP连接,同时支持IPv4和IPv6。 对于IPv4通信,Android中的Socket创建方法如下: ```java Socket socket = new Socket(InetAddress.getByAddress(new ...

    ipv6转换ipv4

    可以实现ipv6转换ipv4进而达到免费上网

    Java实现IPV6地址查询

    在Java编程环境中,实现IPv6地址查询涉及到网络编程和数据库操作。IPv6是互联网协议的第六版,相较于IPv4提供了更大的地址空间,以应对互联网设备数量的急剧增长。本项目利用ZX公网IPv6库(版本20120916)来执行IPv6...

    IPAddress:Java库,用于处理IPv4和IPv6的IP地址和子网

    IP地址 用于处理IPv4和IPv6的IP地址和子网的库 ,打包为OSGI软件包,... 需要Java 8或更高版本,具有MAC地址支持,与IPv6的EUI-48和EUI-64 MAC集成,新地址框架,新的IP字符串格式已解析和生成以及其他附加功能 需要

    IPv6 Java方法 简写转成全写,全写转成简写

    将非简写的IPv6转换成简写的IPv6 ```java public static String parseFullIPv6ToAbbreviation(String fullIPv6) { // 初始化返回结果 String abbreviation = ""; // 检查IPv6地址的有效性 int count = ...

    ip-bigint:将IPv4和IPv6地址转换为本地BigInt,反之亦然

    ip-bigint 将IPv4和IPv6地址转换为本地BigInt,反之亦然安装npm i ip-bigint例子const { parse , stringify } = require ( "ip-bigint" ) ;const { number , version } = parse ( "2001:db8::" ) ;// =&gt; number: ...

    IPv6 和IPv4

    在过渡和兼容性方面,IPv6设计了多种机制来与IPv4共存,如隧道技术(如6to4和ISATAP)、双栈部署和NAT-PT(网络地址转换-协议翻译)。这些方法使得网络能够同时运行IPv4和IPv6,从而平滑地进行过渡。 然而,IPv6的...

    IPV6Util.rar

    5. **IPv6地址的转换**:IPv6地址还可以与IPv4地址互换,或者与IPv4映射的IPv6地址(例如`::ffff:0:0/96`)进行转换,这个类可能包含了这些转换的功能。 6. **IPv6的子网划分**:根据提供的子网掩码,工具可能能够...

    IPv6 地址/掩码计算器

    IPv6(Internet Protocol Version 6)是互联网协议的第六版,设计用来替代IPv4,以应对全球IP地址耗尽的问题。IPv6引入了更大的地址空间,由128位组成,采用冒号十六进制表示法,使得可以分配数量庞大的设备独立的...

    JAVAIPV网络协议问题分析论文

    论文可能涉及Java中处理IP地址转换和路由的问题,包括如何在IPv4和IPv6之间进行转换,以及如何利用Java的NetworkInterface类来获取和配置网络接口的IP地址。此外,可能会讨论Java中的Socket和ServerSocket类如何在...

    ip6-java.zip

    标题中的"ip6-java.zip"表明这是一个与IPv6(Internet Protocol version 6)相关的Java项目。IPv6是互联网协议的最新版本,它扩展了IPv4的地址空间,提供了更大的网络地址容量,以应对互联网设备数量的快速增长。在...

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    3. **IP地址转换**:工具类可能还包含了IP字符串与`InetAddress`对象之间的转换,以及IPv4和IPv6之间的转换功能。 4. **IP地址校验**:为了确保处理的IP地址有效,`IpUtils`可能包含了IP地址格式的验证函数。 5. *...

    java开发-IP解析方案-最新GeoIP2与IP2LOCATIO与dbIP离线数据库文件

    Java开发者可以使用dbip-api-java库来访问dbIP数据库,该库提供了简单的API接口,便于在Java项目中集成。 在实际应用中,这些离线数据库文件通常以二进制格式存储,为了便于Java程序读取,需要先将其加载到内存或者...

    java 获取计算机名与IP地址

    `Java.jpg`文件可能是与这个主题相关的示例或说明图片,但由于无法直接查看文件内容,这里不再做具体解释。在实际开发中,这样的图片可能用于演示网络配置、IP地址显示或其他相关概念的可视化。 总的来说,Java提供...

    Java网络编程从入门到精通(1):Internet地址概述 所有连入Internet的 ....doc

    例如,A34E:DD3D:1234:4400:A123:B231:A111:DDAA是完整的IPv6地址,可以简化为A34E:3D:4:4400:A123:B231:A111:DDAA或A34E::A123:B231:161.17.221.170,后者是在IPv4和IPv6混合环境中表示IPv4部分的方式。 为了方便...

    java根据ip反查省市县地址

    为了方便处理,IP地址分为IPv4和IPv6两种类型,本例主要讨论IPv4。 实现IP反查地址的功能,通常会依赖于IP库或服务,如MaxMind的GeoIP数据库。GeoIP数据库包含了全球IP地址与地理位置的映射关系,包括国家、地区、...

    java实现ip地址与十进制数相互转换

    在Java编程中,IP地址与十进制数之间的转换是一个常见的需求,特别是在网络编程和数据处理中。IP地址通常以点分十进制(dotted decimal notation)的形式表示,如"192.168.1.1",而计算机内部则是以32位无符号整数的...

    java拿取本机正在使用的ip及本机mac地址

    本文将详细讲解如何通过Java代码来获取本机正在使用的IP地址(包括IPv4和IPv6)以及MAC地址,并排除虚拟机的IP。 首先,我们需要了解一点基础知识。IP地址是互联网上设备的唯一标识,分为IPv4和IPv6两种类型。IPv4...

    获取本机IP地址的代码

    1. **IPv4与IPv6**: - IP地址分为IPv4和IPv6两种类型。IPv4地址由32位二进制数组成,通常以点分十进制形式表示(如192.168.1.1)。而IPv6地址则扩展到了128位,采用冒号十六进制表示(如2001:0db8:85a3:0000:0000:...

Global site tag (gtag.js) - Google Analytics