100分~求一ip掩码的算法

fiter2004 2006-06-22 11:08:02
如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段拆分成如上掩码格式的算法~

谢谢
...全文
180 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiter2004 2006-06-26
  • 打赏
  • 举报
回复
谢了
hijack 2006-06-23
  • 打赏
  • 举报
回复
程序没错,你试就知道了(第3行是unsigned int i)
使用的时候要把IP转成int,如ip2.2.2.2转成0x02020202,ip2.2.2.8转成0x02020208
计算后再把int转换成IP格式,
fiter2004 2006-06-23
  • 打赏
  • 举报
回复
不好意思,可能我还没说清楚,我要的是精确的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本身
hijack 2006-06-22
  • 打赏
  • 举报
回复
现写了一段,计算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;
}
nuaawenlin 2006-06-22
  • 打赏
  • 举报
回复
掩码是从主机地址分离出子网的地址

所以需要判断你的ip属于那一类,然后得到主机地址的长度,然后得到掩码的长度
DentistryDoctor 2006-06-22
  • 打赏
  • 举报
回复
拔码的长度,从左往右数,是多少就有多少个二进制的1,
oyljerry 2006-06-22
  • 打赏
  • 举报
回复
本来掩码长度就决定了地址段的范围
fiter2004 2006-06-22
  • 打赏
  • 举报
回复
是否表述不够清楚,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段如何划分掩码的算法~

希望各位大虾帮忙~~~

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧