免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3764 | 回复: 9
打印 上一主题 下一主题

[C] 求ip地址段转化为掩码形式! [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:52:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-22 21:52 |只看该作者 |倒序浏览
就是任意一段IP地址(同一个网段就行),如192.168.1.2-192.168.1.5这个可简化为两条192.168.1.2/31,192.168.1.4/31掩码形式,
若从1到254则有10来条,要求任意ip地址段(同一网段就可以)转化为掩码形式的C程序,求高手帮帮忙!!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2013-07-23 08:17 |只看该作者
如192.168.1.2-192.168.1.5这个可简化为两条192.168.1.2/31,192.168.1.4/31掩码形式
------ 看不懂,猜不出

如果是求最小掩码,只要“或”一下,2|5 ==> 7

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:52:30
3 [报告]
发表于 2013-07-25 15:51 |只看该作者
回复 2# bruceteen
意思就是一段IP地址简化为几条:如192.168.1.2/31就可以表示两条IP地址192.168.1.2和192.168.1.3,31表示前面31位是确定的。谢了,我已经找到了答案!
   

论坛徽章:
0
4 [报告]
发表于 2015-11-17 11:14 |只看该作者
我看了你的提问帖,我也想知道怎么把ip段转为掩码格式

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
5 [报告]
发表于 2015-11-17 13:55 |只看该作者
回复 4# oathupdate
两个IP地址位与就可以得到


   

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
6 [报告]
发表于 2015-11-17 16:08 |只看该作者
我也想知道怎么把ip段转为掩码格式

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
7 [报告]
发表于 2015-11-21 11:07 |只看该作者
  1. /* ipmask.c - Cobras */

  2. #include <stdio.h>

  3. #define MASK_BIT      8
  4. #define MASK_DATA    ((1 << MASK_BIT) - 1)

  5. int get_data_mask_bit(int data)
  6. {
  7.         int mask;

  8.         if (data >= 0 && data <= MASK_DATA) {
  9.                 for (mask = 0; (data & 1) == 0 && mask < MASK_BIT; data >>= 1, ++mask) {
  10.                 }
  11.                 return mask;
  12.         }
  13.         return -1;
  14. }

  15. int get_data_mask(int start, int end, int (*get_func)(int start, int bit_mask, void *usrdata), void *usrdata)
  16. {
  17.         int mask;
  18.         int mask_data;

  19.         if (start >= 0 && end <= MASK_DATA && start <= end) {
  20.                 ++end;
  21.                 while (start < end) {
  22.                         mask = get_data_mask_bit(start);
  23.                         mask_data = 1 << mask;
  24.                         while (start + mask_data > end) {
  25.                                 --mask;
  26.                                 mask_data >>= 1;
  27.                         }
  28.                         if (get_func != NULL) {
  29.                                 (*get_func)(start, MASK_BIT - mask, usrdata);
  30.                         }
  31.                         start += mask_data;
  32.                 }
  33.                 return 0;
  34.         }
  35.         return -1;
  36. }

  37. #if 1 /* TESTCASE */

  38. int print_mask(int start, int bit_mask, void *usrdata)
  39. {
  40.         printf("%d/%d\n", start, bit_mask);
  41.         return 0;
  42. }

  43. int test_get(int start, int end)
  44. {
  45.         int retval;

  46.         printf("GET %d, %d\n", start, end);
  47.         retval = get_data_mask(start, end, print_mask, NULL);
  48.         printf("RETURN: %d\n", retval);
  49.         return 0;
  50. }

  51. int main(void)
  52. {
  53.         test_get(5, 3);
  54.         test_get(-1, 2);
  55.         test_get(2, 5);
  56.         test_get(0, 3);
  57.         test_get(1, 1);
  58.         test_get(0, 255);
  59.         test_get(0, 254);
  60.         return 0;
  61. }

  62. #endif
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2015-11-21 11:22 |只看该作者
这段代码可以支持1-31位的任意正整数的掩码数据。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2015-11-21 11:23 |只看该作者
错了,是1-30位。要注意数据的边界问题。

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:52:30
10 [报告]
发表于 2016-05-04 15:48 |只看该作者
这么久的问题还有人回答。多谢楼上的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP