如何根据网络掩码前缀获取IPv6 addreess?

时间:2013-02-01 07:51:48

标签: ip ipv6 ipv4

我的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();
    }

1 个答案:

答案 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::'