Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Ipv6Address:
- def __init__(self, address: bytearray):
- assert len(address) == 16, address
- # I chose to store the address as the Big Int, because
- # it occupies less memory compared to bytearray in Python:
- # 232 (big int) vs 288 (bytearray)
- self.int_ = int.from_bytes(address, byteorder='big', signed=False)
- def __str__(self) -> str:
- parts = []
- addr = self.int_
- for _ in range(8): # 8 groups of 2 bytes each
- v = addr & 0xFFFF
- part = '{:02X}'.format(v).removeprefix('0x').zfill(4)
- parts.append(part)
- addr >>= 16
- ret = ':'.join(reversed(parts))
- return ret
- def as_int(self) -> int:
- return self.int_
- def addr_from_string(address: str) -> Ipv6Address:
- # example: 2345:0425:2CA1:0000:0000:0567:5673:23b5
- parts = address.split(':')
- ls = []
- for i in range(8):
- if i < len(parts) and parts[i] != '':
- part = bytearray.fromhex(parts[i])
- else:
- part = bytearray.fromhex('0x0000')
- ls.append(part)
- assert len(ls) == 8, ls
- return Ipv6Address(b''.join(ls))
- class Ipv6Network:
- def __init__(self, addr:Ipv6Address, network_mask_bits:int):
- self.addr = addr
- self.network_mask_bits = network_mask_bits
- def __str__(self):
- return str(self.addr) + '/' + str(self.network_mask_bits)
- def contains(self, addr: Ipv6Address) -> bool:
- '''Returns True if the given address is within this network.'''
- low_bits = 128 - self.network_mask_bits
- net_addr_bits = self.addr.as_int() >> low_bits
- input_addr_bits = addr.as_int() >> low_bits
- return net_addr_bits == input_addr_bits
- def main():
- addr1 : Ipv6Address = addr_from_string('0A0B:0001:0000:0000:0000:0000:0000:FF00')
- addr2 : Ipv6Address = addr_from_string('0A0B:FF00:0000:0000:0000:0000:FFFF:0000')
- addr3 : Ipv6Address = addr_from_string('0A0B:00FF:0000:0000:0000:0000:FFFF:0000')
- addr4 : Ipv6Address = addr_from_string('0A0A:0001:0000:0000:0000:0000:FFFF:0000')
- for addr in [addr1, addr2, addr3, addr4]:
- net = Ipv6Network(addr1, network_mask_bits=17)
- contains = net.contains(addr)
- if contains:
- print(f'Network [{net}] contains the address [{addr}]')
- else:
- print(f'Network [{net}] does not contain [{addr}]')
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment