Bitweise Operationen mit IPv6-Adressen und Netzwerken in Python

English Deutsch

Python3 verfügt über die benutzerfreundliche ipaddress-Bibliothek, die viele Berechnungen bereitstellt. Bitweise boolesche Operatoren sind für Adressen jedoch nicht verfügbar.

Dieser Beitrag zeigt Ihnen, wie Sie bitweise Operationen mit IPv6Address()-Objekten durchführen. Wir verwenden die folgende Strategie:

  1. Verwenden Sie .packed, um eine binäre bytes()-Instanz der IP-Adresse zu erhalten
  2. Verwenden Sie int.from_bytes(), um einen Integer zu erhalten, der die binäre Adresse repräsentiert
  3. Führen Sie bitweise Operationen mit diesem Integer durch
  4. Verwenden Sie result.to_bytes(16, ...), um den Integer zurück in ein bytes()-Array in der korrekten Byte-Reihenfolge umzuwandeln
  5. Konstruieren Sie ein IPv6Address()-Objekt aus dem resultierenden Byte-Array.

Python-Code:

bitwise_ipv6_utils.py
import ipaddress

def bitwise_and_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") & int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

def bitwise_or_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") | int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

def bitwise_xor_ipv6(addr1, addr2):
    result_int = int.from_bytes(addr1.packed, byteorder="big") ^ int.from_bytes(addr2.packed, byteorder="big")
    return ipaddress.IPv6Address(result_int.to_bytes(16, byteorder="big"))

Beispielverwendung:

bitwise_ipv6_example.py
a = ipaddress.IPv6Address('2001:16b8:2703:8835:9ec7:a6ff:febe:96b1')
b = ipaddress.IPv6Address('2001:16b8:2703:4241:9ec7:a6ff:febe:96b1')

print(bitwise_and_ipv6(a, b)) # IPv6Address('2001:16b8:2703:1:9ec7:a6ff:febe:96b1')
print(bitwise_or_ipv6(a, b)) # IPv6Address('2001:16b8:2703:ca75:9ec7:a6ff:febe:96b1')
print(bitwise_xor_ipv6(a, b)) # IPv6Address('0:0:0:ca74::')

Ebenso können Sie den Code verwenden, um IPv6Network()-Instanzen zu manipulieren:

bitwise_ipv6_network_example.py
a = ipaddress.IPv6Network('2001:16b8:2703:8835:9ec7:a6ff:febe::/112')
b = ipaddress.IPv6Network('2001:16b8:2703:4241:9ec7:a6ff:febe::/112')

print(bitwise_and_ipv6(a.network_address, b.network_address)) # IPv6Address('2001:16b8:2703:1:9ec7:a6ff:febe:0')
print(bitwise_or_ipv6(a.network_address, b.network_address)) # IPv6Address('2001:16b8:2703:ca75:9ec7:a6ff:febe:0')
print(bitwise_xor_ipv6(a.network_address, b.network_address)) # IPv6Address('0:0:0:ca74::')

Beachten Sie, dass der Rückgabetyp immer IPv6Address() und niemals IPv6Network() ist, da das Ergebnis der bitweisen Operation keine zugehörige Netzmaske hat.

Neben .network_address können Sie auch andere Eigenschaften von IPv6Address()-Instanzen wie .broadcast_address oder .hostmask oder .netmask verwenden.


Check out similar posts by category: Networking, Python