如何将ipv6字符串地址转换为16个字节?
问题描述
由于要避免查找,我想使用InetAddress
创建InetAddress.getByAddress(byte[])
。我的Ipv6地址类似于fe80::59eb:9920:1139:6dd3%4
或fe80:0000:0000:0000:59eb:9920:1139:6dd3%4
根据Java文档,它应该是16个字节,它有8个块。似乎每个块都应转换为2个字节,怎么做?
我在链接Java IPv6 Address String to Bytes之后检查了
他们建议这样做
InetAddress a = InetAddress.getByName("2001:0DB8:AC10:FE01:0000:0000:0000:0000");
byte[] bytes = a.getAddress();
这无济于事,因为InetAddress.getByName()
会进行查找并且可能会阻塞吗?
更新:
我是java字节工作的新手。我猜
所以是16个字节,
以128二进制格式,ipv6地址的每个字符(从左到右或从右到左??)都添加了“ |” 。然后将得到输出
或
以128位二进制格式,向左移至所有字符,例如
示例:(f)0000(e)0000(8)0000(0)0000等
我不确定。我对这个概念更加困惑
思路:
不,你错了。建议的方法是正确且可行的。
InetAddress a = InetAddress.getByName("2001:0DB8:AC10:FE01:0000:0000:0000:0000");
byte[] bytes = a.getAddress();
System.out.println(Arrays.toString(bytes));
输出为:
[[32,1,13,-72,-84,16,-2,1,0,0,0,0,0,0,0,0]
如果给getByName()
提供IP名称(例如ajax.com
),它将执行IP查找。如果您按照代码示例的方式提供IP地址,则不会。从此文档:
如果提供原义IP地址,则仅地址的有效性格式已检查。
([Documentation of InetAddress.getByName()
)
输出中的负数可能会令人惊讶。在Java中,字节始终是带符号的数字。因此,我们可能认为介于128到255之间的字节为-128到-1。