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."""