File: hexadecimal.py

package info (click to toggle)
python-bitarray 3.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 1,288 kB
  • sloc: python: 11,456; ansic: 7,657; makefile: 73; sh: 6
file content (52 lines) | stat: -rw-r--r-- 1,683 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from time import perf_counter

from bitarray import bitarray, get_default_endian
from bitarray.util import urandom, ba2hex, hex2ba


# ----- conversion using prefix codes

CODEDICT = {'little': {}, 'big': {
    '0': bitarray('0000'),    '1': bitarray('0001'),
    '2': bitarray('0010'),    '3': bitarray('0011'),
    '4': bitarray('0100'),    '5': bitarray('0101'),
    '6': bitarray('0110'),    '7': bitarray('0111'),
    '8': bitarray('1000'),    '9': bitarray('1001'),
    'a': bitarray('1010'),    'b': bitarray('1011'),
    'c': bitarray('1100'),    'd': bitarray('1101'),
    'e': bitarray('1110'),    'f': bitarray('1111'),
}}
for k, v in CODEDICT['big'].items(): # type: ignore
    CODEDICT['little'][k] = v[::-1]  # type: ignore

def prefix_ba2hex(a):
    return ''.join(a.decode(CODEDICT[a.endian]))

def prefix_hex2ba(s, endian=None):
    a = bitarray(0, endian or get_default_endian())
    a.encode(CODEDICT[a.endian], s)
    return a

# ----- test

def test_round(f, g, n, endian):
    # f: function which takes bitarray and returns hexstr
    # g: function which takes hexstr and returns bitarray
    # n: size of random bitarray
    a = urandom(n, endian)
    t0 = perf_counter()
    s = f(a)
    print('%s:  %6.3f ms' % (f.__name__, 1000.0 * (perf_counter() - t0)))
    t0 = perf_counter()
    b = g(s, endian)
    print('%s:  %6.3f ms' % (g.__name__, 1000.0 * (perf_counter() - t0)))
    assert b == a

if __name__ == '__main__':
    n = 100_000_004
    for endian in 'little', 'big':
        print('%s-endian:' % endian)
        for f in ba2hex, prefix_ba2hex:
            for g in hex2ba, prefix_hex2ba:
                test_round(f, g, n, endian)
        print()