如ip段:2.2.2.2-2.2.2.8可以拆分成2.2.2.2/31 2.2.2.4/30 2.2.2.8/32三个掩码格式,现求任意ip段拆分成如上掩码格式的算法~谢谢

解决方案 »

  1.   

    是否表述不够清楚,ip掩码可以表示可以用/24等形式,如2.2.2.0-2.2.2.255,可以表示为2.2.2.0/24,代表包含所有2.2.2.x网段的ip,但如上边的2.2.2.2-2.2.2.8这个ip段,无法只用一个/24之类的掩码精确表示,须划分为多个掩码:
               2.2.2.2/31包含2.2.2.2和2.2.2.3两个ip,
               2.2.2.4/30包含2.2.2.4-2.2.2.7四个ip,
               2.2.2.8/32代表2.2.2.8本身
    我想要的是求任意一个ip段如何划分掩码的算法~希望各位大虾帮忙~~~
      

  2.   

    现写了一段,计算32位数掩码,IP转换成unsigned int即可
    unsigned int n1 = 2;
    unsigned int n2 = 8;
    for (int i = n1; i <= n2; ) {
    unsigned int nShift, nMask, nDelta;
    for (unsigned int k = 0; k < 32; k++) {
    unsigned int ns = k;
    unsigned int nm = i & (0xffffffff << ns);
    unsigned int nd = 1 << ns;
    if (i != nm || i + nd - 1 > n2) break;
    nShift = ns;
    nMask = nm;
    nDelta = nd;
    }
    cout << nMask << "/" << 32 - nShift << endl;
    i = i + nDelta;
    }
      

  3.   

    不好意思,可能我还没说清楚,我要的是精确的ip段的掩码,2.2.2.2的8位二进制最后一个2表示为0000 0010,
            如果掩码为/28(最后8位11110000),则表示的ip段是2.2.2.0-2.2.2.15,超出了所要求的2.2.2.2-2.2.2.8范围
            如果掩码为/29(最后8位11111000),则表示的ip段是2.2.2.0-2.2.2.7,也不在范围内
            掩码/30(最后8位11111100),则是2.2.2.0-2.2.2.3也是不对的
    所以只能分成多个掩码表示,就像上边说的        
               2.2.2.2/31(11111110)包含2.2.2.2和2.2.2.3两个ip,
               2.2.2.4/30(11111100)包含2.2.2.4-2.2.2.7四个ip,
               2.2.2.8/32(11111111)代表2.2.2.8本身
      

  4.   

    程序没错,你试就知道了(第3行是unsigned int i)
    使用的时候要把IP转成int,如ip2.2.2.2转成0x02020202,ip2.2.2.8转成0x02020208
    计算后再把int转换成IP格式,