免费注册 查看新帖 |

Chinaunix

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

贡献一个小软件:子网计算器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-18 09:23 |只看该作者 |倒序浏览
折腾了好久,总算把这个小程序做好了。功能很简单,输入ip地址和子网掩码,计算出网络号和广播地址。贡献出来,大家有空也帮忙挑挑错,我自己测试是没啥问题。

附件中有两个文件,e-wxsubnet.py是英文的(去掉了注释和所有中文字符),在windows下也可以执行。wxsubnet.py是中文的,包含注释,只能在linux下运行,windows下运行会报错,我觉得是字符集的问题。

subnet.zip (2.99 KB, 下载次数: 107)

需要安装wxpython。

当作附件上传了,论坛的代码显示似乎有bug,会自动把一些特殊字符去掉,比如“$'”

另外,哪位好心再帮忙看看下面这个问题:

http://bbs.chinaunix.net/thread-1723551-1-1.html

论坛徽章:
0
2 [报告]
发表于 2010-06-18 09:58 |只看该作者
汗,你怎么把 docstring 注释掉了……

论坛徽章:
0
3 [报告]
发表于 2010-06-18 10:27 |只看该作者
  1. #!/usr/bin/python
  2. #-*- coding: utf-8 -*-
  3. #FileName: subnet-calculator.py
  4. '''这个小程序的功能是给定ip地址及子网掩码,
  5. 计算出相关的网络号以及广播地址'''
  6. import re

  7. import wx

  8. class MyFrame(wx.Frame):
  9.     def __init__(self):
  10.         wx.Frame.__init__(self, None, -1, u'子网掩码计算器', size=(500, 200))
  11.         panel = wx.Panel(self, -1)
  12.         wx.StaticText(panel, -1, u'IP地址:', pos=(10, 12))
  13.         self.ipCtrl = wx.TextCtrl(panel, -1, '', pos=(70, 10), size=(300, -1))
  14.         wx.StaticText(panel, -1, u'子网掩码:', pos=(10, 42))
  15.         self.maskCtrl = wx.TextCtrl(panel, -1, '', pos=(70, 40), size=(300, -1))
  16.         wx.StaticText(panel, -1, u'计算结果:', pos=(10, 72))
  17.         self.resCtrl = wx.TextCtrl(panel, -1, '', pos=(70, 70), size=(400, -1))
  18.         button = wx.Button(panel, label=u'计算', pos=(70, 100))
  19.         self.Bind(wx.EVT_BUTTON, self.OnClick, button)

  20.     def emu_bit_or(self, bit1, bit2):
  21.     #'''这个小函数用于模拟或运算'''
  22.         if bit1 == '0' and bit2 == '0':
  23.             return '0'
  24.         else:
  25.             return '1'

  26.     def list_or(self, list1, list2):
  27.     #'''这个小程序里,list都是8位的,模拟按位或运算'''
  28.         result = []
  29.         for i in range(0,8):
  30.             result.append(self.emu_bit_or(list1[i], list2[i]))
  31.         return result

  32.     def bin2dec(self, num):
  33.         return str(int(num, 2))
  34.     def ipnum_dec2bin(self, ipnum):
  35.     #'''将ip地址转换成8位2进制数,不足8位补齐'''
  36.         result = ''
  37.         num = int(ipnum)
  38.         while num > 0:
  39.             mod = num % 2
  40.             num /= 2
  41.             result = str(mod) + result
  42.         if len(result) != 8:
  43.             result = '0'*(8-len(result)) + result
  44.         return result

  45.     def str2list(self, mystr):
  46.         return [i for i in mystr]

  47.     def list2str(self, mylist):
  48.         result = ''
  49.         for i in mylist:
  50.             result += i
  51.         return result

  52.     def emu_invert(self, mybit):
  53.     #'''模拟取反操作'''
  54.         if mybit == '1':
  55.             return '0'
  56.         else:
  57.             return '1'

  58.     def emu_list_invert(self, mylist):
  59.         return [self.emu_invert(i) for i in mylist]

  60.     def str_or_str(self, ipnum1, ipnum2):
  61.     #'''模拟ip地址的按位或操作,每次操作ip地址中的一个数字返回值为一个8位二进制字符串'''
  62.         str1 = self.ipnum_dec2bin(ipnum1)
  63.         str2 = self.emu_list_invert(self.ipnum_dec2bin(ipnum2))
  64.         str1 = self.str2list(str1)
  65.         str2 = self.str2list(str2)
  66.         return self.list2str(self.list_or(str1, str2))

  67.     def check_ip(self, ip):
  68.         return re.match('(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])$',ip)

  69.     def check_mask(self, mask):
  70.         if mask == '0.0.0.0':
  71.             return False
  72.         if self.check_ip(mask):
  73.             mask = mask.split(".")
  74.             masknum = [int(num) for num in mask]
  75.             maskbin = ''
  76.             for num in masknum:
  77.                 maskbin += self.ipnum_dec2bin(num)
  78.             if '01' in maskbin:
  79.                 return False
  80.             else:
  81.                 return True

  82.     def OnClick(self, event):
  83.         ipaddr = self.ipCtrl.GetValue()
  84.         mask = self.maskCtrl.GetValue()
  85.         if not self.check_ip(ipaddr):
  86.             self.resCtrl.SetValue(u"请输入正确的ip地址")
  87.         elif not self.check_mask(mask):
  88.             self.resCtrl.SetValue(u"请输入正确的子网掩码")
  89.         else:
  90.             ipaddr = ipaddr.split(".")
  91.             mask = mask.split(".")
  92.             ipnum = [int(num) for num in ipaddr]
  93.             masknum = [int(num) for num in mask]
  94.             subnet = []
  95.             broadcast = []
  96.             for i in range(0, 4):
  97.                 subnet.append(ipnum[i] & masknum[i])
  98.                 broadcast.append(self.str_or_str(ipnum[i], masknum[i]))
  99.             subnet = [str(num) for num in subnet]
  100.             subnet = ".".join(subnet)
  101.             broadcast = [self.bin2dec(num) for num in broadcast]
  102.             broadcast = ".".join(broadcast)
  103.             self.resCtrl.SetValue(u"网络号是:%s    广播地址是:%s" % (subnet, broadcast))
  104. #        result = self.posCtrl.GetValue()
  105. #        self.resCtrl.SetValue('%s' % result)



  106. if __name__ == '__main__':
  107.     app = wx.PySimpleApp()
  108.     frame = MyFrame()
  109.     frame.Show(True)
  110.     app.MainLoop()

复制代码

论坛徽章:
0
4 [报告]
发表于 2010-06-18 10:28 |只看该作者
汗,你怎么把 docstring 注释掉了……
jjj137 发表于 2010-06-18 09:58



缩进是一种风格,我忘了这句话了,加上docstring之后,总报错,所以才注释掉了,刚才试了一下,增加缩进之后就没问题了。。真是低级的错误。

论坛徽章:
0
5 [报告]
发表于 2010-06-18 13:58 |只看该作者
def str_or_str(self, ipnum1, ipnum2):
    #'''模拟ip地址的按位或操作,每次操作ip地址中的一个数字返回值为一个8位二进制字符串'''
        str1 = self.ipnum_dec2bin(ipnum1)
        str2 = self.emu_list_invert(self.ipnum_dec2bin(ipnum2))
        str1 = self.str2list(str1)
        str2 = self.str2list(str2)
        return self.list2str(self.list_or(str1, str2))

    def check_ip(self, ip):
        return re.match('(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])$',ip)

    def check_mask(self, mask):
        if mask == '0.0.0.0':
            return False
        if self.check_ip(mask):
            mask = mask.split(".")
            masknum = [int(num) for num in mask]
            maskbin = ''
            for num in masknum:
                maskbin += self.ipnum_dec2bin(num)
            if '01' in maskbin:
                return False
            else:
                return True
chinaunix874 发表于 2010-06-18 09:23


好笨的办法啊,直接两个整数与一下不就得了?

论坛徽章:
0
6 [报告]
发表于 2010-06-18 14:17 |只看该作者
把ip跟掩码与一下网络地址不就出来了,搞这么一大堆出来。
  1. def nd(ip,mask):
  2.     ip=ip.split('.')
  3.     mask =mask.split('.')
  4.     return [ str(int(i)&int(m)) for i,m in map(None,ip,mask)]
  5. print '.'.join(nd('192.168.100.5','255.255.255.0'))
复制代码

论坛徽章:
0
7 [报告]
发表于 2010-06-18 14:19 |只看该作者
好笨的办法啊,直接两个整数与一下不就得了?
luffy.deng 发表于 2010-06-18 13:58



计算网络号的时候是两个整数直接做“按位与”操作的。
可是计算广播地址,是“ip地址 或  取反(子网掩码)”,我以前问过一个按位取反的问题,因为python对一个整数取反得到的是一个负数,所以没法子,我就只好用这个笨办法了。
自己写了一些函数来模拟取反还有或操作。

论坛徽章:
0
8 [报告]
发表于 2010-06-18 14:29 |只看该作者
本帖最后由 luffy.deng 于 2010-06-18 14:33 编辑

回复 7# chinaunix874
因为python对一个整数取反得到的是一个负数
chinaunix874 发表于 2010-06-18 14:19

不是有ctypes么?
  1. import ctypes
  2. print ~255
  3. a = ctypes.c_ubyte(~255)
  4. print a.value
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-06-18 14:38 |只看该作者
回复  chinaunix874

不是有ctypes么?
luffy.deng 发表于 2010-06-18 14:29



   

泪流满面啊!!我E文太烂,所以没特别仔细的看过文档,都是查中文文档,也没看到有这个模块。。结果自己还傻乎乎的写一堆东西。

论坛徽章:
0
10 [报告]
发表于 2010-06-18 14:41 |只看该作者
另外我太不细心了,你之前回另一个取反的问题帖子时,已经提到了ctypes了。

http://bbs.chinaunix.net/viewthread.php?tid=1683554

实在不好意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP