在java中将十六进制转换为ipv6格式

时间:2011-10-10 19:04:04

标签: java tcp

转换从proc / net / tcp6

读取的值
0000000000000000FFFF00000100007F

::ffff:10.200.0.31

我熟悉转换ipv4格式:只有 0100007F 使用hextoString,然后获取字节并将其传递给InetAddress api,我得到ip地址,如 10.45.34.22 。如果我按照相同的步骤,结果是 :: ffff:0:e895: 3bc7

如何解决这个问题

1 个答案:

答案 0 :(得分:1)

实际上,::ffff:0:e895:3bc7是此地址的“官方”形式。类似IPv4的形式::ffff:10.200.0.31(顺便说一下,地址不一样)只是另一种写作方式。

我们如何转换?每对十六进制数字对应于一个字节,以及IPv4格式中每个. - 分隔的十进制数。在IPv6格式中,每个: - 分隔的块对应16位(2个字节),每个地址一个“多个零”序列可以缩写为::

您的0000000000000000FFFF00000100007F因此映射到0000:0000:0000:0000:FFFF:0000:0100:007F作为完整格式的IPv6地址。

如果IPv6地址是某种形式的映射IPv4地址,则RFC会在section 5. Text Representation of Special Addresses中定义替代格式。最后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位,并手动格式化,或再次使用InetAdress API,将它们格式化为IPv4。