#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.