Преобразование шестнадцатеричного в формат ipv6 в java

#java #tcp

#java #tcp

Вопрос:

Преобразование значений, считанных из proc / net / tcp6

 0000000000000000FFFF00000100007F
  

Для

 ::ffff:10.200.0.31
  

Я знаком с преобразованием форматов ipv4:
используется только 0100007F
hextoString, затем получаю байты и передаю их в api InetAddress, и я получаю ip-адрес, скажем, 10.45.34.22. Если я последую той же процедуре здесь, результат будет :: ffff:0:e895:3bc7

Как это сделать

Комментарии:

1. В чем ваш вопрос?

2. Мой вопрос в том, как преобразовать это шестнадцатеричное значение в подходящий формат, совместимый с ipv6

3. Заданный 0000000000000000FFFF00000100007F должен разрешиться в ::ffff:10.200.0.31

4. Итак, вы спрашиваете, правильно ли :: ffff:0:e895:3bc7? потому что это так.

5. есть ли способ преобразовать из :: ffff: 0: e895: 3bc7 в :: ffff:10.200.0.31?

Ответ №1:

На самом деле, ::ffff:0:e895:3bc7 это «официальная» форма этого адреса. Форма, подобная IPv4 ::ffff:10.200.0.31 (кстати, не тот же адрес), является лишь альтернативным способом ее написания.

Как мы можем преобразовать? Каждая пара шестнадцатеричных цифр соответствует одному байту, а также каждому . десятичному числу, разделенному -в формате IPv4. В формате IPv6 каждый : разделенный блок соответствует 16 битам (2 байта), и одна последовательность «много нулей» на адрес может быть сокращена с :: помощью .

0000000000000000FFFF00000100007F Таким образом, ваш IPv6-адрес отображается 0000:0000:0000:0000:FFFF:0000:0100:007F как полноформатный IPv6-адрес.

Если адрес IPv6 является некоторой формой отображенного адреса IPv4, то RFC определяет альтернативный формат в разделе 5. Текстовое представление специальных адресов. Там последние 32 бита (например, последние два блока, последние 4 байта) заменяются десятичной формой, разделенной точками. В нашем случае 0100:007F имеет байты 0x01, 0x00, 0x00 и 0x7f, что соответствует 1.0.0.127.

Глядя на это, похоже, у вас есть некоторые проблемы с порядком байтов. Формат для IPv4-сопоставленных IPv6-адресов таков :0:0:0:0:0:ffff:‹IPv4› , и в вашем случае это выглядит так, как будто байты внутри каждого 32-битного блока поменялись местами. Так что на самом деле ваш адрес должен быть 0000:0000:0000:0000:0000:FFFF:7F00:0001 , и это может быть записано als ::ffff:127.0.0.1 , хорошо известный адрес локального хоста IPv4, сопоставленный с IPv4.

Итак, моей первой рекомендацией было бы поменять местами байты, поступающие из вашего proc / net / tcp6, в правильном порядке, а затем создать из него InetAdress. Возможно, это уже дает адрес в правильном (смешанном) формате. Если нет, вы можете взять младшие 32 бита выходных данных отдельно и либо отформатировать их вручную, либо снова использовать API InetAdress, чтобы отформатировать их как IPv4.