usim: Properly decode/encode IPv4 + IPv6 addresses
use normal textual representation for IPv4 and IPv6 addresses
Change-Id: I2c6c377f4502af37639e555826c85d5dcf602f9b
diff --git a/pySim/construct.py b/pySim/construct.py
index af96b49..31caf0e 100644
--- a/pySim/construct.py
+++ b/pySim/construct.py
@@ -7,6 +7,7 @@
from pySim.utils import b2h, h2b, swap_nibbles
import gsm0338
import codecs
+import ipaddress
"""Utility code related to the integration of the 'construct' declarative parser."""
@@ -138,6 +139,32 @@
def _encode(self, obj, context, path):
return obj.encode(self.codec, self.err)
+class Ipv4Adapter(Adapter):
+ """
+ Encoder converts from 4 bytes to string representation (A.B.C.D).
+ Decoder converts from string representation (A.B.C.D) to four bytes.
+ """
+ def _decode(self, obj, context, path):
+ ia = ipaddress.IPv4Address(obj)
+ return ia.compressed
+
+ def _encode(self, obj, context, path):
+ ia = ipaddress.IPv4Address(obj)
+ return ia.packed
+
+class Ipv6Adapter(Adapter):
+ """
+ Encoder converts from 16 bytes to string representation.
+ Decoder converts from string representation to 16 bytes.
+ """
+ def _decode(self, obj, context, path):
+ ia = ipaddress.IPv6Address(obj)
+ return ia.compressed
+
+ def _encode(self, obj, context, path):
+ ia = ipaddress.IPv6Address(obj)
+ return ia.packed
+
def filter_dict(d, exclude_prefix='_'):
"""filter the input dict to ensure no keys starting with 'exclude_prefix' remain."""