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

在java中将十六进制转换为ipv6格式,java,tcp,Java,Tcp,转换从proc/net/tcp6读取的值 0000000000000000FFFF00000100007F 到 我熟悉ipv4格式的转换:仅0100007F 使用hextoString,然后获取字节并将其传递给InetAddress api,我获取ip地址,比如说10.45.34.22。如果我在这里遵循相同的过程,结果是:ffff:0:e895:3bc7 如何处理这个问题实际上,:ffff:0:e895:3bc7是这个地址的“官方”形式。类似IPv4的表单::ffff:10.200.0.31(

转换从proc/net/tcp6读取的值

0000000000000000FFFF00000100007F

我熟悉ipv4格式的转换:仅0100007F 使用hextoString,然后获取字节并将其传递给InetAddress api,我获取ip地址,比如说10.45.34.22。如果我在这里遵循相同的过程,结果是:ffff:0:e895:3bc7


如何处理这个问题实际上,
:ffff:0:e895:3bc7
是这个地址的“官方”形式。类似IPv4的表单
::ffff:10.200.0.31
(顺便说一句,地址不同)只是一种替代的书写方式

我们怎样才能转化?每对十六进制数字对应一个字节,以及IPv4格式中以
分隔的十进制数。在IPv6格式中,每个
分隔块对应16位(2字节),每个地址的一个“多零”序列可以缩写为

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

如果IPv6地址是某种形式的映射IPv4地址,则RFC将在中定义替代格式。最后32位(例如,最后两个块,最后4个字节)替换为小数形式,以点分隔。在我们的例子中,
0100:007F
具有字节0x01、0x00、0x00和0x7f,它们对应于1.0.0.127

看看这个,看起来您有一些字节顺序问题。IPv4映射的IPv6地址的格式是
: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的字节交换到正确的顺序,然后从中构造inetaddress。也许这已经给出了正确(混合)格式的地址。如果没有,您可以单独获取输出的最低32位,然后手动将其格式化,或者再次使用InetAddress API将其格式化为IPv4。

实际上,
::ffff:0:e895:3bc7
是此地址的“正式”形式。类似IPv4的表单
::ffff:10.200.0.31
(顺便说一句,地址不同)只是一种替代的书写方式

我们怎样才能转化?每对十六进制数字对应一个字节,以及IPv4格式中以
分隔的十进制数。在IPv6格式中,每个
分隔块对应16位(2字节),每个地址的一个“多零”序列可以缩写为

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

如果IPv6地址是某种形式的映射IPv4地址,则RFC将在中定义替代格式。最后32位(例如,最后两个块,最后4个字节)替换为小数形式,以点分隔。在我们的例子中,
0100:007F
具有字节0x01、0x00、0x00和0x7f,它们对应于1.0.0.127

看看这个,看起来您有一些字节顺序问题。IPv4映射的IPv6地址的格式是
: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的字节交换到正确的顺序,然后从中构造inetaddress。也许这已经给出了正确(混合)格式的地址。如果没有,您可以单独获取输出的最低32位,手动格式化,或者再次使用InetAdress API,将其格式化为IPv4。

您的问题是什么?我的问题是如何将此十六进制值转换为合适的ipv6兼容格式给定000000000000 FF0000100007F必须解析为::ffff:10.200.0.31那么您的问题是::ffff:0:e895:3bc7是否正确?因为它是。有没有办法从::ffff:0:e895:3bc7转换到::ffff:10.200.0.31?你的问题是什么?我的问题是如何将这个十六进制值转换为合适的ipv6兼容格式给定0000000000000000 FFFF000001000007F必须解析为::ffff:10.200.0.31那么你问::ffff:0:e895:3bc7是否正确?因为它是。有没有办法从::ffff:0:e895:3bc7转换到::ffff:10.200.0.31?
::ffff:10.200.0.31