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 件のコメント:
コメントを投稿