1"""Python 'hex_codec' Codec - 2-digit hex content transfer encoding.
2
3This codec de/encodes from bytes to bytes.
4
5Written by Marc-Andre Lemburg (mal@lemburg.com).
6"""
7
8import codecs
9import binascii
10
11### Codec APIs
12
13def hex_encode(input, errors='strict'):
14    assert errors == 'strict'
15    return (binascii.b2a_hex(input), len(input))
16
17def hex_decode(input, errors='strict'):
18    assert errors == 'strict'
19    return (binascii.a2b_hex(input), len(input))
20
21class Codec(codecs.Codec):
22    def encode(self, input, errors='strict'):
23        return hex_encode(input, errors)
24    def decode(self, input, errors='strict'):
25        return hex_decode(input, errors)
26
27class IncrementalEncoder(codecs.IncrementalEncoder):
28    def encode(self, input, final=False):
29        assert self.errors == 'strict'
30        return binascii.b2a_hex(input)
31
32class IncrementalDecoder(codecs.IncrementalDecoder):
33    def decode(self, input, final=False):
34        assert self.errors == 'strict'
35        return binascii.a2b_hex(input)
36
37class StreamWriter(Codec, codecs.StreamWriter):
38    charbuffertype = bytes
39
40class StreamReader(Codec, codecs.StreamReader):
41    charbuffertype = bytes
42
43### encodings module API
44
45def getregentry():
46    return codecs.CodecInfo(
47        name='hex',
48        encode=hex_encode,
49        decode=hex_decode,
50        incrementalencoder=IncrementalEncoder,
51        incrementaldecoder=IncrementalDecoder,
52        streamwriter=StreamWriter,
53        streamreader=StreamReader,
54        _is_text_encoding=False,
55    )
56