2008年6月11日水曜日

netmask

IPアドレスの制限で、ネットマスクの対応が見つからなかった。
128.255.63.0/24なら
アドレスを16進数に直して80ff3f00と2**24-1<<(32-24) & targetを比較すればいいのかな?

式はいくつか思いつくけど、正攻法はどんなものだろうか。
  • 2**32-(1<<32-m)
  • 2**m-1<<32-m

def ip_valid(addr):
for s in IP_RANGE:
t = s.split('/')
if len(t) == 1:
ip = t[0]
mask = '32'
else:
ip = t[0]
mask = t[1]
mask = int(mask)
n = ip2num(ip)
if ip2num(addr) & 2**32-(1<<32-mask) == n:
return True
return False

def ip2num(ip):
n = 0
for i in ip.split('.'):
n <<= 8
n += int(i)
return n

IP_RANGE = [
'210.153.84.0/24',
'123.108.237.9',
'202.179.204.0/24',
'61.202.3.0/24',
]

0 件のコメント: