我的IPv6知识非常有限,可以帮我解决这个问题吗? 众所周知,对于IPv4,如果网络掩码为25,则映射地址应为255.255.255.128。算术代码如下:
public static String getNetmaskFromBits( int bits )
{
StringBuilder b = new StringBuilder( 15 );
int tempBits = 0xFFFFFFFF;
tempBits = tempBits << 32 - bits;
b.append( ( tempBits & 0xFF000000 ) >>> 24 ).append( '.' );
b.append( ( tempBits & 0x00FF0000 ) >>> 16 ).append( '.' );
b.append( ( tempBits & 0x0000FF00 ) >>> 8 ).append( '.' );
b.append( tempBits & 0x000000FF );
return b.toString();
}
IPv6怎么样?它可以是128位。如何将其映射到IPv6地址?代码应该是:
public static String getIpv6NetmaskFromBits( int bits )
{
StringBuilder b = new StringBuilder( 15 );
...
return b.toString();
}
答案 0 :(得分:1)
你不再使用IPv6进行那种屏蔽了。始终使用CIDR表示法显示前缀,如2001:db8::/32
。
如果你真的想这样做,那么最简单的方法是将前缀长度除以4.从那么多f
个字符开始,这对于二进制值1111
是十六进制的。如果有余数,则根据余数添加下一个字符。如果余数为1
,则下一个字符为8
,如果余数为2
,则下一个字符为c
,余数为3
然后下一个字符是e
。然后根据需要添加尽可能多的0
以获得总共32个字符。然后在每第四个字符后添加一个:
分隔符。
如果您愿意,请应用地址符号压缩: - )
示例:
A /32
:
Divide: 32 / 4 = 8
8 * f = 'ffffffff'
Add 0's: 'ffffffff000000000000000000000000'
Add separators: 'ffff:ffff:0000:0000:0000:0000:0000:0000'
Compress notation: 'ffff:ffff::'
A /33
:
Divide: 33 / 4 = 8, remainder: 1
8 * f = 'ffffffff'
Add for remainder: 'ffffffff8'
Add 0's: 'ffffffff800000000000000000000000'
Add separators: 'ffff:ffff:8000:0000:0000:0000:0000:0000'
Compress notation: 'ffff:ffff:8000::'
A /34
:
Divide: 34 / 4 = 8, remainder: 2
8 * f = 'ffffffff'
Add for remainder: 'ffffffffc'
Add 0's: 'ffffffffc00000000000000000000000'
Add separators: 'ffff:ffff:c000:0000:0000:0000:0000:0000'
Compress notation: 'ffff:ffff:c000::'
A /35
:
Divide: 35 / 4 = 8, remainder: 3
8 * f = 'ffffffff'
Add for remainder: 'ffffffffe'
Add 0's: 'ffffffffe00000000000000000000000'
Add separators: 'ffff:ffff:e000:0000:0000:0000:0000:0000'
Compress notation: 'ffff:ffff:e000::'
A /36
:
Divide: 36 / 4 = 9
9 * f = 'fffffffff'
Add 0's: 'fffffffff00000000000000000000000'
Add separators: 'ffff:ffff:f000:0000:0000:0000:0000:0000'
Compress notation: 'ffff:ffff:f000::'
等