Мне нужно преобразовать Mac-адрес в IPv6 Link локальный адрес.
Этот link-local IPv6 выводится из NIC’s mac-адреса.
Процедура преобразования приведена ниже.
взять mac адрес: например 52:74:f2:b1:a8:7f
кинуть ff:fe в середину: 52:74:f2:ff:fe:b1:a8:7f
переформатировать в нотацию IPv6 5274:f2ff:feb1:a87f
преобразовать первый октет из шестнадцатеричного в двоичный: 52 -> 01010010
инвертировать бит с индексом 6 (считая с 0): 01010010 -> 01010000
преобразовать октет обратно в шестнадцатеричный: 01010000 -> 50
замените первый октет новым вычисленным: 5074:f2ff:feb1:a87f
добавьте префикс локальной ссылки: fe80::5074:f2ff:feb1:a87f
Кажется, это много специфических манипуляций со строками и преобразования между системами счисления.
Я искал служебный класс на Java, который мог бы помочь мне сделать то же самое более эффективным способом.
Я вижу, что в Java есть методы InetAddress, чтобы определить, является ли рассматриваемый адрес локальной ссылкой.
Но нам все равно нужно будет выполнять разбиение, замену, повторное объединение, группировку, преобразование и инверсию битов. Кажется, много логики. Я удивлен, что нет утилиты для того же.
У вас есть расширенные утилиты для работы со строками, такие как StringBuilder или StringBuffer.




У Java-библиотека IP-адреса есть методы для этого. Отказ от ответственности: я руководитель проекта этой библиотеки.
Вот пример кода с использованием вашего примера MAC-адреса 52:74:f2:b1:a8:7f
String str = "52:74:f2:b1:a8:7f";
try {
MACAddress mac = new MACAddressString(str).toAddress();
IPv6Address linkLocal = mac.toLinkLocalIPv6();
System.out.println("converted " + mac + " to IPv6 link local " + linkLocal);
} catch(AddressStringException e) {
// handle invalid address string here
}
Выход:
converted 52:74:f2:b1:a8:7f to IPv6 link local fe80::5074:f2ff:feb1:a87f
Больше Примеры есть в вики.
Хороший вклад, ваша библиотека надежна и хорошо протестирована. Я проголосовал за, и я думаю, что это должен быть принятый ответ, вместо того, чтобы пытаться изобретать велосипед с черновиком, который я предоставил.
Реализуете свой собственный конструктор
Inet6Addressи используете Inet6Address#isLinkLocalAddress?