IPV6-адрес в сжатом виде в Java

Я использовал метод Inet6Address.getByName ("2001: db8: 0: 0: 0: 0: 2: 1"). ToString () для сжатия IPv6-адреса , и вывод будет 2001: db8: 0: 0: 0: 0: 2: 1 , но мне нужно 2001: db8 :: 2: 1 . , По сути, сжатие должно быть основано на стандарте RFC 5952 , то есть

1) Сократить как можно больше : Например, 2001: db8: 0: 0: 0: 0: 2: 1 необходимо сократить до
. 2001: db8 :: 2: 1. Аналогично, 2001: db8 :: 0: 1 неприемлемо, потому что символ "::" мог быть использован для создания более короткое представление 2001: db8 :: 1.

2) Обработка одного 16-битового поля 0 : символ «::» НЕ ДОЛЖЕН использоваться для сокращения только одного 16-битного поля 0. Например, представление 2001: db8: 0: 1: 1: 1: 1: 1 правильно, но 2001: db8 :: 1: 1: 1: 1: 1 неверно.

3) Вариант размещения "::" : = Когда есть альтернативный выбор в размещение символа "::" самая длинная серия последовательных 16-битных полей 0 ДОЛЖНА быть сокращена (т. е. последовательность с тремя последовательными нулевыми полями сокращена в 2001 году: 0: 0: 1: 0: 0: 0: 1). Когда длина последовательных 16-битных полей 0 равны (т.е. 2001: db8: 0: 0: 1: 0: 0: 1), первая последовательность нулей биты ДОЛЖНЫ быть сокращены. Например, 2001: db8 :: 1: 0: 0: 1 правильно представление.

Я также проверил другой пост в Stack overflow , но там не было указано никаких условий (пример выбора в размещении: :).

Есть ли какая-нибудь библиотека Java для этого? Может ли кто-нибудь мне помочь?

Заранее спасибо.

14
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

Не совсем изящный, но это - мое предложение (на основе работа chrixm):

public static String shortIpv6Form(String fullIP) {
        fullIP = fullIP.replaceAll("^0{1,3}", "");
        fullIP = fullIP.replaceAll("(:0{1,3})", ":");
        fullIP = fullIP.replaceAll("(0{4}:)", "0:");
        //now we have full form without unnecessaires zeros
        //Ex:
        //0000:1200:0000:0000:0000:0000:0000:0000 -> 0:1200:0:0:0:0:0:0
        //0000:0000:0000:1200:0000:0000:0000:8351 -> 0:0:0:1200:0:0:0:8351
        //0000:125f:0000:94dd:e53f:0000:61a9:0000 -> 0:125f:0:94dd:e53f:0:61a9:0
        //0000:005f:0000:94dd:0000:cfe7:0000:8351 -> 0:5f:0:94dd:0:cfe7:0:8351


        //compress to short notation
        fullIP = fullIP.replaceAll("((?:(?:^|:)0+\\b){2,}):?(?!\\S*\\b\\1:0+\\b)(\\S*)", "::$2");

        return fullIP;
    }
  1. результаты:

    7469:125f:8eb6:94dd:e53f:cfe7:61a9:8351-> 7469:125f:8eb6:94dd:e53f:cfe7:61a9:8351 7469:125f:0000:0000:e53f:cfe7:0000:0000-> 7469:125f:: e53f:cfe7:0:0 7469:125f:0000:0000:000f:c000:0000:0000-> 7469:125f:: f:c000:0:0 7469:125f:0000:0000:000f:c000:0000:0000-> 7469:125f:: f:c000:0:0 7469:0000:0000:94dd:0000:0000:0000:8351-> 7469:0:0:94dd:: 8 351 0469:125f:8eb6:94dd:0000:cfe7:61a9:8351-> 469:125f:8eb6:94dd:0:cfe7:61a9:8351 0069:125f:8eb6:94dd:0000:cfe7:61a9:8351-> 69:125f:8eb6:94dd:0:cfe7:61a9:8351 0009:125f:8eb6:94dd:0000:cfe7:61a9:8351-> 9:125f:8eb6:94dd:0:cfe7:61a9:8351 0000:0000:8eb6:94dd:e53f:0007:6009:8350->:: 8eb6:94dd:e53f:7:6009:8350 0000:0000:8eb6:94dd:e53f:0007:6009:8300->:: 8eb6:94dd:e53f:7:6009:8300 0000:0000:8eb6:94dd:e53f:0007:6009:8000->:: 8eb6:94dd:e53f:7:6009:8000 7469:0000:0000:0000:e53f:0000:0000:8300-> 7469:: e53f:0:0:8300 7009:100f:8eb6:94dd:e000:cfe7:6009:8351-> 7009:100f:8eb6:94dd:e000:cfe7:6009:8351 7469:100f:8006:900d:e53f:cfe7:61a9:8351-> 7469:100f:8006:900d:e53f:cfe7:61a9:8351 7000:1200:8e00:94dd:e53f:cfe7:0000:0001-> 7000:1200:8e00:94dd:e53f:cfe7:0:1 0000:0000:0000:0000:0000:0000:0000:0000->:: 0000:0000:0000:94dd:0000:0000:0000:0000-> 0:0:0:94dd:: 0000:1200:0000:0000:0000:0000:0000:0000-> 0:1200:: 0000:0000:0000:1200:0000:0000:0000:8351->:: 1200:0:0:0:8351 0000:125f:0000:94dd:e53f:0000:61a9:0000-> 0:125f:0:94dd:e53f:0:61a9:0 7469:0000:8eb6:0000:e53f:0000:61a9:0000-> 7469:0:8eb6:0:e53f:0:61a9:0 0000:125f:0000:94dd:0000:cfe7:0000:8351-> 0:125f:0:94dd:0:cfe7:0:8351 0000:025f:0000:94dd:0000:cfe7:0000:8351-> 0:25f:0:94dd:0:cfe7:0:8351 0000:005f:0000:94dd:0000:cfe7:0000:8351-> 0:5f:0:94dd:0:cfe7:0:8351 0000:000f:0000:94dd:0000:cfe7:0000:8351-> 0:f:0:94dd:0:cfe7:0:8351 0000:0000:0000:0000:0000:0000:0000:0001->:: 1

0
ответ дан 1 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: