Python で IPv4 アドレスの CIDR 表記文字列を数値表現と相互変換する関数を書いた。IPv4 アドレスを数値として扱いたいとき (?) にご活用ください。
def cidr2int(cidr: str) -> tuple[int, int]:
cidr = cidr.split("/", 1)
cidr[0] = cidr[0].split(".")
assert len(cidr[0]) == 4
addr = 0
for i, octet in enumerate(cidr[0]):
assert 0 <= int(octet) <= 0xFF
addr += int(octet) * 0x100 ** (3 - i)
prefix = int(cidr[1])
assert 0 <= prefix <= 32
mask = 0xFFFFFFFF >> (32 - prefix) << (32 - prefix)
return addr, mask
def int2cidr(addr: int, mask: int) -> str:
assert 0 <= addr <= 0xFFFFFFFF
assert 0 <= mask <= 0xFFFFFFFF
octets = reversed([(addr & (0xFF * 0x100**i)) >> (i * 8) for i in range(4)])
return f"{'.'.join([str(octet) for octet in octets])}/{bin(mask).count('1')}"
cidr2int('192.168.1.0/24') #=> (3232235776, 4294967040)
int2cidr(3232235776, 4294967040) #=> '192.168.1.0/24'