mirror of
https://github.com/lionsoul2014/ip2region.git
synced 2025-12-08 19:25:22 +00:00
43 lines
1.0 KiB
Python
43 lines
1.0 KiB
Python
# Created by leolin49 on 2022/7/7.
|
|
# Copyright (C) 2022 leolin49. All rights reserved.
|
|
|
|
shift_index = (24, 16, 8, 0)
|
|
# Util function
|
|
|
|
|
|
def checkip(ip: str) -> int:
|
|
"""Convert ip string to integer."""
|
|
if not is_ipv4(ip):
|
|
return -1
|
|
ps = ip.split(".")
|
|
if len(ps) != 4:
|
|
return 0
|
|
val = 0
|
|
for i in range(len(ps)):
|
|
d = int(ps[i])
|
|
if d < 0 or d > 255:
|
|
return 0
|
|
val |= d << shift_index[i]
|
|
return val
|
|
|
|
|
|
def long2ip(num: int) -> str:
|
|
"""Convert integer to ip string."""
|
|
return "{}.{}.{}.{}".format((num >> 24) & 0xFF, (num >> 16) & 0xFF, (num >> 8) & 0xFF, num & 0xFF)
|
|
|
|
|
|
def mid_ip(sip: int, eip: int):
|
|
"""Get the middle ip between sip and eip."""
|
|
return (sip + eip) >> 1
|
|
|
|
|
|
def is_ipv4(ip: str) -> bool:
|
|
"""Determine whether it is an ipv4 address."""
|
|
p = ip.split(".")
|
|
if len(p) != 4:
|
|
return False
|
|
for pp in p:
|
|
if not pp.isdigit() or len(pp) > 3 or int(pp) > 255:
|
|
return False
|
|
return True
|