【问题标题】:Convert MacAddress to IPv6 Link Local in Java在 Java 中将 MacAddress 转换为 IPv6 本地链接
【发布时间】:2019-05-14 14:11:37
【问题描述】:

我需要将 Mac 地址转换为 IPv6 Link 本地地址。 这个link-local IPv6 是从NIC’s mac 地址推断出来的。 转换过程如下。

  1. 取mac地址:例如52:74:f2:b1:a8:7f

  2. 在中间抛出 ff:fe:52:74:f2:ff:fe:b1:a8:7f

  3. 重新格式化为 IPv6 表示法5274:f2ff:feb1:a87f

  4. 将第一个八位字节从十六进制转换为二进制:52 -> 01010010

  5. 反转索引 6 处的位(从 0 开始计数):01010010 -> 01010000

  6. 将八位字节转换回十六进制:01010000 -> 50

  7. 用新计算的字节替换第一个八位字节:5074:f2ff:feb1:a87f

  8. 添加链接本地前缀:fe80::5074:f2ff:feb1:a87f

这似乎是很多特定的字符串操作和数字系统之间的转换。 我一直在寻找 Java 中的实用程序类,它可以帮助我以更有效的方式做同样的事情。 我看到 Java 在InetAddress 中有方法来确定有问题的地址是否是本地链接。

【问题讨论】:

  • 实现您自己的Inet6Address 构建器并使用Inet6Address#isLinkLocalAddress ?
  • 但我们仍然需要进行拆分、替换、重新加入、分组、转换和位反转。这似乎是很多逻辑。我很惊讶没有相同的实用程序。
  • 您拥有增强的字符串操作实用程序,例如 StringBuilderStringBuffer

标签: java mac-address link-local


【解决方案1】:

IPAddress Java library 具有执行此操作的方法。免责声明:我是该库的项目经理。

这是使用您的示例 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

更多 examples 在 wiki 中。

【讨论】:

  • 很好的贡献,你的库是健壮的并且经过了很好的测试。我投了赞成票,我认为这应该是公认的答案,而不是试图用我提供的草稿重新发明轮子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2018-05-02
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多