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:
- Verwenden Sie
.packed, um eine binärebytes()-Instanz der IP-Adresse zu erhalten - Verwenden Sie
int.from_bytes(), um einen Integer zu erhalten, der die binäre Adresse repräsentiert - Führen Sie bitweise Operationen mit diesem Integer durch
- Verwenden Sie
result.to_bytes(16, ...), um den Integer zurück in einbytes()-Array in der korrekten Byte-Reihenfolge umzuwandeln - 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
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow