Conversion IPv6 to long and long to IPv6(将 IPv6 转换为 long 并将 long 转换为 IPv6)
问题描述
我应该如何执行从 IPv6 到 long 的转换,反之亦然?
How should I perform conversion from IPv6 to long and vice versa?
到目前为止我有:
public static long IPToLong(String addr) {
String[] addrArray = addr.split("\.");
long num = 0;
for (int i = 0; i < addrArray.length; i++) {
int power = 3 - i;
num += ((Integer.parseInt(addrArray[i], 16) % 256 * Math.pow(256, power)));
}
return num;
}
public static String longToIP(long ip) {
return ((ip >> 24) & 0xFF) + "."
+ ((ip >> 16) & 0xFF) + "."
+ ((ip >> 8) & 0xFF) + "."
+ (ip & 0xFF);
}
这是正确的解决方案还是我错过了什么?
Is it correct solution or I missed something?
(如果解决方案对 ipv4 和 ipv6 都有效,那就完美了)
(It would be perfect if the solution worked for both ipv4 and ipv6)
推荐答案
IPv6 地址是一个 128 位数字,如所述 这里.Java 中的 long 以 64 位表示,因此您需要另一种结构,例如 BigDecimal 或两个 long(一个包含两个 long 数组的容器,或者只是一个包含两个 long 数组的容器)来存储 IPv6 地址.
An IPv6 address is a 128-bit number as described here. A long in Java is represented on 64 bits, so you need another structure, like a BigDecimal or two longs (a container with an array of two longs or simply an array of two longs) in order to store an IPv6 address.
下面是一个例子(只是给你一个想法):
Below is an example (just to provide you an idea):
public class Asd {
public static long[] IPToLong(String addr) {
String[] addrArray = addr.split(":");//a IPv6 adress is of form 2607:f0d0:1002:0051:0000:0000:0000:0004
long[] num = new long[addrArray.length];
for (int i=0; i<addrArray.length; i++) {
num[i] = Long.parseLong(addrArray[i], 16);
}
long long1 = num[0];
for (int i=1;i<4;i++) {
long1 = (long1<<16) + num[i];
}
long long2 = num[4];
for (int i=5;i<8;i++) {
long2 = (long2<<16) + num[i];
}
long[] longs = {long2, long1};
return longs;
}
public static String longToIP(long[] ip) {
String ipString = "";
for (long crtLong : ip) {//for every long: it should be two of them
for (int i=0; i<4; i++) {//we display in total 4 parts for every long
ipString = Long.toHexString(crtLong & 0xFFFF) + ":" + ipString;
crtLong = crtLong >> 16;
}
}
return ipString;
}
static public void main(String[] args) {
String ipString = "2607:f0d0:1002:0051:0000:0000:0000:0004";
long[] asd = IPToLong(ipString);
System.out.println(longToIP(asd));
}
}
这篇关于将 IPv6 转换为 long 并将 long 转换为 IPv6的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将 IPv6 转换为 long 并将 long 转换为 IPv6
基础教程推荐
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- Struts2 URL 无法访问 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- 修改 void 函数的输入参数,然后读取 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
