Возможно ли это? Как вы можете преобразовать ipv4 в адрес ipv6?
несколько примеров отсюда:
0.0.0.0 -> ::
127.0.0.1 -> ::1
Я ищу решение на Java.
Спасибо,
Возможно ли это? Как вы можете преобразовать ipv4 в адрес ipv6?
несколько примеров отсюда:
0.0.0.0 -> ::
127.0.0.1 -> ::1
Я ищу решение на Java.
Спасибо,
Нет сопоставления IPv4-IPv6, которое имеет смысл. такие вещи, как 0.0.0.0 и 127.0.0.1, являются особыми случаями в спецификации, поэтому они имеют эквивалентное значение. Но, учитывая адрес IPv4, он ничего не сообщает о том, каким будет его конкретный адрес IPv6. Вы можете использовать поиск DNS, чтобы узнать, разрешает ли данный IP-адрес хосту, который, в свою очередь, разрешает адрес IPv6 в дополнение к IPv4-адресу, но DNS-сервер должен быть настроен для поддержки этого для конкретной машины.
Гибридные двухуровневые реализации IPv6/IPv4 обычно поддерживают специальный класс адресов, IPv4-отображаемых адресов. Для получения дополнительной информации проверьте следующую ссылку:
http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
Для преобразования IPv4 в сопоставленный IPv6 вы можете использовать следующее:
String ip = "127.0.0.1";
String[] octets = ip.split("\\.");
byte[] octetBytes = new byte[4];
for (int i = 0; i < 4; ++i) {
octetBytes[i] = (byte) Integer.parseInt(octets[i]);
}
byte ipv4asIpV6addr[] = new byte[16];
ipv4asIpV6addr[10] = (byte)0xff;
ipv4asIpV6addr[11] = (byte)0xff;
ipv4asIpV6addr[12] = octetBytes[0];
ipv4asIpV6addr[13] = octetBytes[1];
ipv4asIpV6addr[14] = octetBytes[2];
ipv4asIpV6addr[15] = octetBytes[3];
Также проверьте this
В IPv6 для IPv4-адресов было зарезервированное адресное пространство, где вы просто префикс IPv4-адреса составляли 96 0-бит. Например. 192.168.10.13 -> ::C0A8:0A0D
. Поскольку я знаю, что это было устаревшим, и там больше нет прямого преобразования.
IPv6 совместим с IPv4.
Адрес IPv4: пример 192.168.99.1
Шаг1 >
Разделите первый октет (192) на 16 (поскольку Hex - это Base-16) IE: 192/16 = 12 раз ровно с 0 слева - 12 в Hex представлен как C - 0 (ноль) в Hex, как вы уже догадались, 0 Таким образом, 192 в HEX C0
Шаг2 >
Повторите шаг 1 со вторым октетом (168), IE: 168/16 = 10 раз с 8 оставшимися, потому что 10 * 6 = 160, - 10 в HEX - это A - 8 в HEX - 8 Таким образом, 168 в HEX A8
Шаг 3 >
Правила повторения!!! Третий октет (99) IE: 99/16 = 6 раз с 3 оставшимися - 6 в HEX - 6 - 3 в HEX - 3 Таким образом, 99 в HEX 63
Шаг4 >
Последний октет IE: 1/16 = 0 раз с 1 слева - 0 в HEX есть, да 0 - 1 в HEX - 1 Таким образом, 1 в HEX 01
Таким образом, IPv4-адрес 192.168.99.1, представленный в части адреса IPv6, будет C0A8: 6301. Однако вам нужно использовать строчные буквы и добавить все отсутствующие байты IPv6, поэтому правильный код:
:: c0a8: 6301
или вы можете использовать синтаксис, который теперь всегда принимается:
:: 192.168.99.1
Таким образом, в конце адрес IPv6 может быть старым адресом с символами :: до старого адреса.
Существует множество способов сопоставления IPv4 и IPv6. Для большинства таких методов преобразованный адрес IPv4 помещается в младшие 4 байта 16-байтового адреса IPv6.
В библиотеке Java IPAddress есть методы, помогающие справиться со многими из наиболее распространенных способов преобразования IPv4 в IPv6. Отказ от ответственности: я руководитель проекта этой библиотеки.
Например, учитывая IPv4-адрес, вы можете преобразовать его в IPv6, как показано, используя преобразование IPv6-преобразования:
IPv6Address ipv6Address = new IPAddressString("1.2.3.4").getAddress().toIPv4().
getIPv4MappedAddress().toIPv6();
System.out.println(ipv6Address); // ::ffff:102:304
System.out.println(ipv6Address.toMixedString()); // ::ffff:1.2.3.4
С помощью экземпляра IPv6Address вы можете проверить, сопоставлен ли адрес IPv4, совместим с IPv4, переведен IPv4 и т.д. (Это некоторые из многих возможных способов, которыми IPv6 представляет адреса IPv4). После этого вы можете преобразовать обратно в IPv4.
if(addr.isIPv4Compatible() || addr.isIPv4Mapped()) {
IPv4Address derivedIpv4Address = ipv6Address.getLowerIPv4Address();
byte ipv4Bytes[] = ipv4Address.getBytes();
...
}
Вот код преобразования в Javascript
/** IPV4 CIDR to IPV6 CIDR conversion **/
function covertIPv6(x){
let ipV4 = x;
let address = ipV4.split('/');
let classValues = [];
if(address.length){
classValues = address[0].split('.');
}
if(classValues.length){
let str = classValues.reduce((acc, val, ind)=>{
let mod = +val >= 16 ? +val%16 : +val;
let divider = +val >= 16 ? (val-mod)/16 : 0;
const hexaCode = (hexaVal)=>{
switch(hexaVal){
case 10:
hexaVal = 'A';
break;
case 11:
hexaVal = 'B';
break;
case 12:
hexaVal = 'C';
break;
case 13:
hexaVal = 'D';
break;
case 14:
hexaVal = 'E';
break;
case 15:
hexaVal = 'F';
break;
default:
hexaVal = hexaVal;
break;
}
return hexaVal;
}
mod = hexaCode(mod);
divider = hexaCode(divider);
return ind === 1 ? '${acc}${divider}${mod}:':'${acc}${divider}${mod}'
},'')
return '2002:${str}::/${address[1]}';
}
return "Invalid Address";
}
// Run the function
console.log(covertIPv6("0.0.0.0/12"));