【问题标题】:How to get the IPv6 addreess according to the netmask prefix?如何根据网络掩码前缀获取 IPv6 地址?
【发布时间】:2013-02-01 07:51:47
【问题描述】:

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

【问题讨论】:

标签: ip ipv6 ipv4


【解决方案1】:

您不再使用 IPv6 进行这种屏蔽。前缀始终使用 CIDR 表示法显示,例如 2001:db8::/32

如果您真的想这样做,那么最简单的方法是将前缀长度除以 4。从许多 f 字符开始,这是二进制值 1111 的十六进制。如果有余数,则根据余数添加下一个字符。如果余数为1,则下一个字符为8,如果余数为2,则下一个字符为c,如果余数为3,则下一个字符为e。然后根据需要添加尽可能多的0,以获得总共 32 个字符。然后在每四个字符后添加一个: 分隔符。

如果您愿意,可以应用地址符号压缩 :-)

例子:

/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::'

/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::'

/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::'

/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::'

/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::'

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2015-02-11
    • 2015-05-16
    相关资源
    最近更新 更多