runnig

ipv6

Apr 2nd, 2024 (edited)
821
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.45 KB | None | 0 0
  1. class Ipv6Address:
  2.     def __init__(self, address: bytearray):
  3.         assert len(address) == 16, address
  4.         # I chose to store the address as the Big Int, because
  5.         # it occupies less memory compared to bytearray in Python:
  6.         # 232 (big int) vs 288 (bytearray)
  7.         self.int_ = int.from_bytes(address, byteorder='big', signed=False)
  8.  
  9.     def __str__(self) -> str:
  10.         parts = []
  11.         addr = self.int_
  12.         for _ in range(8):  # 8 groups of 2 bytes each
  13.             v = addr & 0xFFFF
  14.             part = '{:02X}'.format(v).removeprefix('0x').zfill(4)
  15.             parts.append(part)
  16.             addr >>= 16
  17.         ret = ':'.join(reversed(parts))
  18.         return ret
  19.  
  20.     def as_int(self) -> int:
  21.         return self.int_
  22.  
  23. def addr_from_string(address: str) -> Ipv6Address:
  24.     # example: 2345:0425:2CA1:0000:0000:0567:5673:23b5
  25.     parts = address.split(':')
  26.     ls = []
  27.     for i in range(8):
  28.         if i < len(parts) and parts[i] != '':
  29.             part = bytearray.fromhex(parts[i])
  30.         else:
  31.             part = bytearray.fromhex('0x0000')
  32.         ls.append(part)
  33.     assert len(ls) == 8, ls
  34.     return Ipv6Address(b''.join(ls))
  35.  
  36. class Ipv6Network:
  37.     def __init__(self, addr:Ipv6Address, network_mask_bits:int):
  38.         self.addr = addr
  39.         self.network_mask_bits = network_mask_bits
  40.  
  41.     def __str__(self):
  42.         return str(self.addr) + '/' + str(self.network_mask_bits)
  43.  
  44.     def contains(self, addr: Ipv6Address) -> bool:
  45.         '''Returns True if the given address is within this network.'''
  46.         low_bits = 128 - self.network_mask_bits
  47.         net_addr_bits = self.addr.as_int() >> low_bits
  48.         input_addr_bits = addr.as_int() >> low_bits
  49.         return net_addr_bits == input_addr_bits
  50.  
  51. def main():
  52.     addr1 : Ipv6Address = addr_from_string('0A0B:0001:0000:0000:0000:0000:0000:FF00')
  53.     addr2 : Ipv6Address = addr_from_string('0A0B:FF00:0000:0000:0000:0000:FFFF:0000')
  54.     addr3 : Ipv6Address = addr_from_string('0A0B:00FF:0000:0000:0000:0000:FFFF:0000')
  55.     addr4 : Ipv6Address = addr_from_string('0A0A:0001:0000:0000:0000:0000:FFFF:0000')
  56.     for addr in [addr1, addr2, addr3, addr4]:
  57.         net = Ipv6Network(addr1, network_mask_bits=17)
  58.         contains = net.contains(addr)
  59.         if contains:
  60.             print(f'Network [{net}] contains the address [{addr}]')
  61.         else:
  62.             print(f'Network [{net}] does not contain [{addr}]')
  63.  
  64. if __name__ == '__main__':
  65.     main()
  66.  
Advertisement
Add Comment
Please, Sign In to add comment