求IPV6函数 1 IPV6检验函数 查看一个TEXT添的IPV6是否正确2 IPV6 TO short[8]3 IPV6 TO BYTE[16] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class IPv6 { public static void main(String[] args) { String ipv6 = "3255:0304:0000:FE4A:174F:5577:289C:0014"; short[] s = ipv6ToShort(ipv6); byte[] b = ipv6ToByte(ipv6); for (short c : s) { System.out.printf("%9d ", c); } System.out.println(); for (byte c : b) { System.out.printf("%4d ", c); } System.out.println(); System.out.println(checkIPv6(ipv6)); } // 将 IPv6 转为 byte[16],大于 0x7F 的值用负数表示 public static byte[] ipv6ToByte(String ipv6) { byte[] ipv6Byte = new byte[16]; String[] ipv6s = ipv6.split(":"); for (int i = 0; i < ipv6Byte.length / 2; i++) { int k = Integer.parseInt(ipv6s[i], 16); ipv6Byte[2 * i] = (byte) (k >> 8); ipv6Byte[2 * i + 1] = (byte) ((k | 0xff00) & 0xff); } return ipv6Byte; } // 将 IPv6 转为 short[8],大于 0x7FFF 的值用负数表示 public static short[] ipv6ToShort(String ipv6) { short[] ipv6Short = new short[8]; String[] ipv6s = ipv6.split(":"); for (int i = 0; i < ipv6Short.length; i++) { ipv6Short[i] = (short)Integer.parseInt(ipv6s[i], 16); } return ipv6Short; } // 检验 IPv6 的格式 public static boolean checkIPv6(String ipv6) { return ipv6.matches("(\\p{XDigit}){1,4}(:(\\p{XDigit}){1,4}){7}"); }} bao110908(bao)(bao) 还有特殊的IPV6格式。下面是JDK里的IPV6事例,程序没有考虑。1080:0:0:0:8:800:200C:417A1080::8:800:200C:417A::FFFF:129.144.52.38 ::129.144.52.38 ::FFFF:d.d.d ::FFFF:d.d ::d.d.d ::d.d ::FFFF:d ::FFFF:d.d.d ::FFFF:d.d ::d.d.d ::d.d 上述地址是无效的,还有::FFFF:d ::d虽是有效的,但易与 IPv6 混淆,属于非常规的格式,在转换时一律看作是 IPv6 格式。若为非正常的 IPv6 地址,在 toStandarIPv6() 方法中会产生异常,不知是否能够捕获异常来判断。至于,正则表达式验证较为复杂,我暂时无法完成,肯请高人帮忙。以下是更改后的代码段public class IPv6 { public static void main(String[] args) { String ipv6 = "41:3::4:FFFF:210.147.158.1"; System.out.println(checkIPv6(ipv6)); ipv6 = toStandarIPv6(ipv6); System.out.println(ipv6); short[] s = ipv6ToShort(ipv6); byte[] b = ipv6ToByte(ipv6); for (short c : s) { System.out.printf("%9d ", c); } System.out.println(); for (byte c : b) { System.out.printf("%4d ", c); } System.out.println(); } // 转换成标准格式的 IPv6 public static String toStandarIPv6(String ipv6) { ipv6 = ipv6.trim(); String[] ipv6s = ipv6.split(":"); StringBuffer ip6 = new StringBuffer(); for(int i=0; i<ipv6s.length; i++){ if(ipv6s[i].length()!=0){ while(ipv6s[i].length()<4){ ipv6s[i] = "0" + ipv6s[i]; } } ip6.append(ipv6s[i]).append(":"); } ipv6 = ip6.toString().substring(0, ip6.length()-1); // 是否带有 IPv4 后缀 int pre = (ipv6.indexOf('.') < 0) ? 8 : 7; // 补足 IPv6 中被压缩的部分 if (ipv6s.length < pre) { StringBuffer sb = new StringBuffer(); if (ipv6.indexOf("::") != 0) { sb.append(":"); } else { sb.append("0000:"); } for (int i = ipv6s.length; i <= pre; i++) { sb.append("0000:"); } ipv6 = ipv6.replace("::", sb.toString()); } if (pre == 7) { // 将后缀的 4 位 IPv4,转为 2 位的 IPv6 String[] ipv4 = ipv6s[ipv6s.length - 1].split("\\."); StringBuffer sb = new StringBuffer(); for (int i = 0; i < ipv4.length / 2; i++) { sb.append(":"); String hex = Integer.toHexString(Integer.parseInt(ipv4[2 * i])); hex = (hex.length() < 2) ? "0" + hex : hex; sb.append(hex); hex = Integer.toHexString(Integer.parseInt(ipv4[2 * i + 1])); hex = (hex.length() < 2) ? "0" + hex : hex; sb.append(hex); } ipv6 = ipv6.substring(0, ipv6.lastIndexOf(":")); ipv6 = ipv6 + sb.toString(); } return ipv6.toUpperCase(); } // 将IPv6转为byte[16],大于 0x7F 的值用负数表示 public static byte[] ipv6ToByte(String ipv6) { byte[] ipv6Byte = new byte[16]; String[] ipv6s = ipv6.split(":"); for (int i = 0; i < ipv6Byte.length / 2; i++) { int k = Integer.parseInt(ipv6s[i], 16); ipv6Byte[2 * i] = (byte) (k >> 8); ipv6Byte[2 * i + 1] = (byte) (k & 0xff); } return ipv6Byte; } // 将IPv6转为short[8],大于 0x7FFF 的值用负数表示 public static short[] ipv6ToShort(String ipv6) { short[] ipv6Short = new short[8]; String[] ipv6s = ipv6.split(":"); for (int i = 0; i < ipv6Short.length; i++) { ipv6Short[i] = (short) Integer.parseInt(ipv6s[i], 16); } return ipv6Short; } public static boolean checkIPv6(String ipv6) { // 验证暂时无法完成,肯请高手帮忙 return true; }} CSDN 好慢!!!花了一个多小时又重新上来了,呵呵~~ bao110908(bao)(bao) 辛苦了。学习中 随机数 新手求教继承的问题. java控制台应用程序 Java生成exe文件 %java_home%\lib\dt.jar,dt.jar是什么?有什么作用。? 程序打包后密码域出问题了 文字列连接效率的问题(a+b ? a.concat(concat)? 还是用StringBuffer) 读写数据库的问题 学着写了一个buttonEvent的例子,有两个地方不明白,请指点一下。谢谢。 请问各位大侠!! 关于包的问题 大家说这道程序运行结果输出什么?
String ipv6 = "3255:0304:0000:FE4A:174F:5577:289C:0014";
short[] s = ipv6ToShort(ipv6);
byte[] b = ipv6ToByte(ipv6);
for (short c : s) {
System.out.printf("%9d ", c);
}
System.out.println();
for (byte c : b) {
System.out.printf("%4d ", c);
}
System.out.println();
System.out.println(checkIPv6(ipv6));
} // 将 IPv6 转为 byte[16],大于 0x7F 的值用负数表示
public static byte[] ipv6ToByte(String ipv6) {
byte[] ipv6Byte = new byte[16];
String[] ipv6s = ipv6.split(":");
for (int i = 0; i < ipv6Byte.length / 2; i++) {
int k = Integer.parseInt(ipv6s[i], 16);
ipv6Byte[2 * i] = (byte) (k >> 8);
ipv6Byte[2 * i + 1] = (byte) ((k | 0xff00) & 0xff);
}
return ipv6Byte;
}
// 将 IPv6 转为 short[8],大于 0x7FFF 的值用负数表示
public static short[] ipv6ToShort(String ipv6) {
short[] ipv6Short = new short[8];
String[] ipv6s = ipv6.split(":");
for (int i = 0; i < ipv6Short.length; i++) {
ipv6Short[i] = (short)Integer.parseInt(ipv6s[i], 16);
}
return ipv6Short;
}
// 检验 IPv6 的格式
public static boolean checkIPv6(String ipv6) {
return ipv6.matches("(\\p{XDigit}){1,4}(:(\\p{XDigit}){1,4}){7}");
}
}
还有特殊的IPV6格式。下面是JDK里的IPV6事例,程序没有考虑。
1080:0:0:0:8:800:200C:417A
1080::8:800:200C:417A
::FFFF:129.144.52.38
::129.144.52.38
::FFFF:d.d.d
::FFFF:d.d
::d.d.d
::d.d
::FFFF:d
::FFFF:d.d
::d.d.d
::d.d 上述地址是无效的,还有::FFFF:d
::d虽是有效的,但易与 IPv6 混淆,属于非常规的格式,在转换时一律看作是 IPv6 格式。若为非正常的 IPv6 地址,在 toStandarIPv6() 方法中会产生异常,不知是否能够捕获异常来判断。至于,正则表达式验证较为复杂,我暂时无法完成,肯请高人帮忙。以下是更改后的代码段public class IPv6 { public static void main(String[] args) { String ipv6 = "41:3::4:FFFF:210.147.158.1";
System.out.println(checkIPv6(ipv6));
ipv6 = toStandarIPv6(ipv6);
System.out.println(ipv6);
short[] s = ipv6ToShort(ipv6);
byte[] b = ipv6ToByte(ipv6);
for (short c : s) {
System.out.printf("%9d ", c);
}
System.out.println();
for (byte c : b) {
System.out.printf("%4d ", c);
}
System.out.println();
} // 转换成标准格式的 IPv6
public static String toStandarIPv6(String ipv6) {
ipv6 = ipv6.trim();
String[] ipv6s = ipv6.split(":");
StringBuffer ip6 = new StringBuffer();
for(int i=0; i<ipv6s.length; i++){
if(ipv6s[i].length()!=0){
while(ipv6s[i].length()<4){
ipv6s[i] = "0" + ipv6s[i];
}
}
ip6.append(ipv6s[i]).append(":");
}
ipv6 = ip6.toString().substring(0, ip6.length()-1); // 是否带有 IPv4 后缀
int pre = (ipv6.indexOf('.') < 0) ? 8 : 7;
// 补足 IPv6 中被压缩的部分
if (ipv6s.length < pre) {
StringBuffer sb = new StringBuffer();
if (ipv6.indexOf("::") != 0) {
sb.append(":");
} else {
sb.append("0000:");
}
for (int i = ipv6s.length; i <= pre; i++) {
sb.append("0000:");
}
ipv6 = ipv6.replace("::", sb.toString());
}
if (pre == 7) {
// 将后缀的 4 位 IPv4,转为 2 位的 IPv6
String[] ipv4 = ipv6s[ipv6s.length - 1].split("\\.");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ipv4.length / 2; i++) {
sb.append(":");
String hex = Integer.toHexString(Integer.parseInt(ipv4[2 * i]));
hex = (hex.length() < 2) ? "0" + hex : hex;
sb.append(hex);
hex = Integer.toHexString(Integer.parseInt(ipv4[2 * i + 1]));
hex = (hex.length() < 2) ? "0" + hex : hex;
sb.append(hex);
}
ipv6 = ipv6.substring(0, ipv6.lastIndexOf(":"));
ipv6 = ipv6 + sb.toString();
}
return ipv6.toUpperCase();
} // 将IPv6转为byte[16],大于 0x7F 的值用负数表示
public static byte[] ipv6ToByte(String ipv6) {
byte[] ipv6Byte = new byte[16];
String[] ipv6s = ipv6.split(":");
for (int i = 0; i < ipv6Byte.length / 2; i++) {
int k = Integer.parseInt(ipv6s[i], 16);
ipv6Byte[2 * i] = (byte) (k >> 8);
ipv6Byte[2 * i + 1] = (byte) (k & 0xff);
}
return ipv6Byte;
} // 将IPv6转为short[8],大于 0x7FFF 的值用负数表示
public static short[] ipv6ToShort(String ipv6) {
short[] ipv6Short = new short[8];
String[] ipv6s = ipv6.split(":");
for (int i = 0; i < ipv6Short.length; i++) {
ipv6Short[i] = (short) Integer.parseInt(ipv6s[i], 16);
}
return ipv6Short;
} public static boolean checkIPv6(String ipv6) {
// 验证暂时无法完成,肯请高手帮忙
return true;
}
}
辛苦了。学习中