Как преобразовать адрес из IPv4 в IPv6 - PullRequest
22 голосов
/ 12 октября 2009

Возможно ли это? Как вы можете конвертировать IPv4 в IPv6-адрес?

Вот несколько примеров:

0.0.0.0   -> ::
127.0.0.1 -> ::1

Я ищу решение на Java.

Спасибо

Ответы [ 6 ]

31 голосов
/ 12 октября 2009

Нет сопоставления IPv4 и IPv6, которое имеет смысл. такие вещи, как 0.0.0.0 и 127.0.0.1, являются особыми случаями в спецификации, поэтому они имеют эквивалентное значение. Но, учитывая адрес IPv4, он ничего не говорит о том, каким будет его конкретный адрес IPv6. Вы можете использовать поиск DNS, чтобы увидеть, преобразуется ли данный IP-адрес в хост, который, в свою очередь, преобразуется в IPv6-адрес в дополнение к IPv4-адресу, но DNS-сервер должен быть настроен для поддержки этого для конкретного компьютера. 1001 *

19 голосов
/ 28 апреля 2010

Гибридные реализации 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];

Также проверьте это

5 голосов
/ 12 октября 2009

Раньше в IPv6 было зарезервированное адресное пространство для адресов IPv4, где вы просто добавляли префикс IPv4 к 96 0 битам. Например. 192.168.10.13 -> ::C0A8:0A0D. Как я знаю, это устарело, и прямого преобразования больше не существует.

3 голосов
/ 23 мая 2016

IPv6 совместим с IPv4.

IPv4-адрес: пример 192.168.99.1

Step1>

Разделите первый октет (192) на 16 (поскольку Hex - это Base-16) IE: 192/16 = 12 раз точно с 0 осталось больше - 12 в шестнадцатеричном формате представлен как C - 0 (ноль) в Hex есть, как вы уже догадались, 0 Таким образом, 192 в HEX это C0

Step2>

Повторите шаг 1 со вторым октетом (168), IE: 168/16 = 10 раз с 8 осталось, потому что 10 * 6 = 160, - 10 в HEX - это A - 8 в HEX это 8 Таким образом, 168 в HEX это A8

Step3>

Правила повторения !!! Третий октет (99) IE: 99/16 = 6 раз с 3 осталось - 6 в HEX - это 6 - 3 в HEX это 3 Таким образом, 99 в HEX это 63

Step4>

Последний октет 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-адрес может быть старым адресом с :: символами перед старым адресом.

2 голосов
/ 27 марта 2018

Существует множество способов сопоставления 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();
    ...
 }
0 голосов
/ 13 декабря 2018

Вот код преобразования в 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...