hexlify: update codec for Python 2, fixes #87
diff --git a/serial/tools/hexlify_codec.py b/serial/tools/hexlify_codec.py
index f8449e2..635f7d3 100644
--- a/serial/tools/hexlify_codec.py
+++ b/serial/tools/hexlify_codec.py
@@ -21,29 +21,36 @@
 import codecs
 import serial
 
+
+try:
+    unicode
+except (NameError, AttributeError):
+    unicode = str       # for Python 3, pylint: disable=redefined-builtin,invalid-name
+
+
 HEXDIGITS = '0123456789ABCDEF'
 
 
 # Codec APIs
 
 def hex_encode(data, errors='strict'):
-    """'40 41 42' -> '@ab'"""
+    """'40 41 42' -> b'@ab'"""
     return (serial.to_bytes([int(h, 16) for h in data.split()]), len(data))
 
 
 def hex_decode(data, errors='strict'):
-    """'@ab' -> '40 41 42'"""
-    return (''.join('{:02X} '.format(b) for b in data), len(data))
+    """b'@ab' -> '40 41 42'"""
+    return (unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data))), len(data))
 
 
 class Codec(codecs.Codec):
     def encode(self, data, errors='strict'):
-        """'40 41 42' -> '@ab'"""
+        """'40 41 42' -> b'@ab'"""
         return serial.to_bytes([int(h, 16) for h in data.split()])
 
     def decode(self, data, errors='strict'):
-        """'@ab' -> '40 41 42'"""
-        return ''.join('{:02X} '.format(b) for b in data)
+        """b'@ab' -> '40 41 42'"""
+        return unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data)))
 
 
 class IncrementalEncoder(codecs.IncrementalEncoder):
@@ -92,7 +99,7 @@
 class IncrementalDecoder(codecs.IncrementalDecoder):
     """Incremental decoder"""
     def decode(self, data, final=False):
-        return ''.join('{:02X} '.format(b) for b in data)
+        return unicode(''.join('{:02X} '.format(ord(b)) for b in serial.iterbytes(data)))
 
 
 class StreamWriter(Codec, codecs.StreamWriter):
@@ -113,5 +120,5 @@
         incrementaldecoder=IncrementalDecoder,
         streamwriter=StreamWriter,
         streamreader=StreamReader,
-        _is_text_encoding=True,
+        #~ _is_text_encoding=True,
     )