Java中Ipv4与Ipv6的转换「建议收藏」

IPConvert.java类的主要作用是将ip(ipv6\ipv4)转换成16个字节的数组,其中ipv4的转换是先将v4地址转换成v6再转换成长度是16的字节数组 packagecom.cvicse.naba.common.utils;/****描述:*<p>*   &n…

大家好,又见面了,我是你们的朋友全栈君。

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;
}
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125762.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 无锡梅里旅游策划方案——中国第一锡宫!

    无锡梅里旅游策划方案——中国第一锡宫!无锡梅里旅游策划方案——中国第一锡宫!熊大寻旅游策划公司/文无锡梅里古都”,位于无锡新区梅村,是吴文化的发祥地。梅村古名梅里,早在三千二百多年前,西周周太王长子泰伯,为达成父王想立三子季历的愿望,偕二弟仲雍托辞采药,夜奔江南,拴马于枯树桩。到清早,见枯枝上梅花朵朵,喜出望外,顿悟此地当为宝地。于是为其取“梅里”之名,定居于此。勾吴之国,由此发端。因泰伯三让两家天下,孔子称其为“至德”,司马迁的…

  • java中short、int、long、float、double取值范围「建议收藏」

    java中short、int、long、float、double取值范围「建议收藏」对于java的数据类型,既熟悉又陌生,于是整理了这篇文档。最近的面试让我开始注意细节,细节真的很重要。一、分析基本数据类型的特点,最大值和最小值。1、基本类型:int二进制位数:32包装类:java.lang.Integer最小值:Integer.MIN_VALUE=-2147483648(-2的31次方)最大值:Integer.MAX_VALUE=2147

  • hdu 3336 Count the string(kmp应用)

    hdu 3336 Count the string(kmp应用)ProblemDescriptionItiswellknownthatAekdyCoinisgoodatstringproblemsaswellasnumbertheoryproblems.Whengivenastrings,wecanwritedownallthenon-emptyprefixesofthisstring.

  • 初识SQL Server2017 图数据库(一)

    初识SQL Server2017 图数据库(一)

    2021年11月24日
  • java复杂对象转json字符串_java处理json数据

    java复杂对象转json字符串_java处理json数据最近对自己写的elasticsearch客户端框架在进行性能优化,数据插入部分使用的是JAVABean对象方式传参,框架内部使用了fastjson进行对象转json字符串的操作,尝试着使用不同方式进行对象转json字符串操作。找到了一种性能更好的方式,具体请看下面代码段:packagetest;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importcom.google.common…

  • IIS 无法启动:发生意外错误0x8ffe2740 的原因

    IIS 无法启动:发生意外错误0x8ffe2740 的原因发生意外错误0x8ffe2740原因如果系统中存在端口冲突就有可能发生本情况.IIS默认使用80端口进行HTTP通信.如果除IIS外的应用程序正在运行并且正在相同的IP地址上使用80端口,在您试图使用IIS管理器启动网站时您也可能收到该错误讯息.解决方法要解决这个问题,您可以进行以下任一项操作:•在IIS管理器中更改网站绑定端口为除80端口外的其它端口.•停止正在使用80端口…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号