source: proto/s2k/demo/lib/bitutil.py @ 3610

Last change on this file since 3610 was 3610, checked in by ksherdy, 5 years ago

Commit s2l library demo files.

File size: 4.5 KB
Line 
1#
2# Robert D. Cameron
3# August 19, 2009
4#
5# Ken Herdy
6# Jan 10, 2014
7#
8# bitutil.py
9#
10# Bitstream Utilities
11#
12# These are quick-and-dirty Python implementations of utilities
13# for demo purposes only.
14#
15#----------------------------------------------------------------------------
16#
17# We use python's unlimited precision integers for unbounded bit streams.
18# This permits simple logical operations on the entire stream.
19# Assumption: bitstreams are little-endian (e.g., as on x86).
20#
21#----------------------------------------------------------------------------
22#
23import sys
24import codecs
25import binascii
26# Utility functions for demo purposes.
27#
28
29def writefile(filename, s, charcode='utf-8',):
30        f = codecs.open(filename, 'w', encoding=charcode)
31        f.write(s) # writes encoded bytes to file
32        f.close()
33
34def readfile(filename):
35        f = open(filename, 'r')
36        contents = f.read() 
37        f.close()
38        return contents
39
40def bitstream2string(stream, lgth, zero_ch='_'):
41        str = ""
42        for i in range(lgth):
43                if stream & 1 == 1: str += '1'
44                else: str += zero_ch
45                stream >>= 1
46        return str
47
48def bitstream2stringLE(stream, lgth, zero_ch='_'):
49        str = ""
50        for i in range(lgth):
51                if stream & 1 == 1: str = '1' + str
52                else: str = zero_ch + str
53                stream >>= 1
54        return str
55
56def string2bitstream(s):
57        rslt = 0
58        for i in s[::-1]:
59                rslt *= 2
60                if i == '1': rslt += 1
61        return rslt
62
63def print_aligned_streams(stream_list):
64        """Print out a set of aligned streams."""
65        label_max = max([len(p[0]) for p in stream_list])
66        bstr_max = max([len(p[1]) for p in stream_list])
67        for p in stream_list:
68                print (p[0] + " "*(label_max - len(p[0]))) + p[1].rjust(bstr_max)
69
70def aligned_streams(stream_list):
71        """Print out a set of aligned streams."""
72        label_max = max([len(p[0]) for p in stream_list])
73        bstr_max = max([len(p[1]) for p in stream_list])
74        r = ""
75        for p in stream_list:
76                r += (p[0] + " "*(label_max - len(p[0]))) + " " + p[1].rjust(bstr_max)
77                r += "\n"
78        return r
79
80def latex_aligned_streams(stream_list):
81        """Return a latex table for streams."""
82        label_max = max([len(p[0]) for p in stream_list])
83        bstr_max = max([len(p[1]) for p in stream_list])
84
85        table = "\\begin{tabular}{lr}"
86        for p in stream_list:
87                table += "\\\\\n" "\\verb`" + (p[0] + " "*(label_max - len(p[0]))) + " `" +" & \\verb`" + p[1].rjust(bstr_max) +"`"
88        return table + "\n\\end{tabular}\n"
89
90def print_aligned_u8_byte_streams(u8_byte_stream):
91        """Print out a set of 'encoding' aligned streams."""
92
93        # Set the system info to print utf-8
94        info = codecs.lookup('utf-8')
95        sys.stdout = info.streamwriter(sys.stdout) 
96
97        label_max = max([len(p[0]) for p in u8_byte_stream])
98        for p in u8_byte_stream:
99                sys.stdout.write(p[0] + " "*(label_max - len(p[0])) + ": ")
100               
101                for c in (p[1].decode('utf-8')):                        # for each unicode character
102                        u8_seq_len = len(c.encode('utf-8'))     # encode the unicode character as utf-8 and get the utf-8 sequence length
103                        if u8_seq_len == 1:
104                                sys.stdout.write(c)
105                        elif u8_seq_len == 2:
106                                sys.stdout.write('2_')                          # align 2 byte sequences with a trailing 2
107                        elif u8_seq_len == 3:
108                                sys.stdout.write('3__')                         # align 3 byte sequences with 2 trailing 3's
109                        elif u8_seq_len == 4:
110                                sys.stdout.write('4___')                        # align 2 byte sequences with 3 trailing 4's             
111                        else:
112                                sys.stdout.write('Error: Invalid UTF-8 character sequence of length: ' + str(u8_seq_len) + '.')                 
113                sys.stdout.write('\n')   
114
115def high_nybble_stream(bytes):
116        str=""
117        for b in bytes:
118                h = hex(ord(b))[-2]
119                if h == 'x': str += '0'
120                else: str += h
121        return str
122
123def low_nybble_stream(bytes):
124        str=""
125        for b in bytes:
126                str += hex(ord(b))[-1]
127        return str
128
129#
130#  Convert bytesarray a binary string and Zero fill.
131def bytes_to_bstr(bytes):
132  bstr = ""
133  for b in bytes:
134    bstr += bin(int(binascii.hexlify(b), 16))[2:].zfill(8)   
135  return bstr
136
137#
138#  Convert byte array a stream (unbounded integer).
139def bytes_to_strm(bytes):
140  bstr = ""
141  for b in bytes:
142    bstr += bin(int(binascii.hexlify(b), 16))[2:].zfill(8)   
143  return int(bstr,2)
144
145#
146#  Convert binary string (zero fill) to binary integer.
147def bstr_to_strm(bstr):
148        return int(bstr,2)
149
150#
151#  Zero extend
152def zfill(bstr, fw):
153        lgth            = len(bstr)
154        rem                     = (lgth % fw)
155        return ("0" * (0 if rem == 0 else fw - rem)) + bstr
156
157#
158#  Convert strm of 2^k fields to a binary string. Zero fill.
159def strm_to_bstr(strm, fw=1):
160        bstr = bin(strm)[2:]
161        return zfill(bstr, fw)
162
163#
164#  Align and delimit binary string.
165def format_fields(bstr, delim_offset=1, ralign=0, delim_char='|'):
166  format_bstr = delim_char
167  for i in range(0, len(bstr), delim_offset):
168    format_bstr +=  (bstr[i:i+delim_offset]).rjust(ralign) + delim_char
169  return format_bstr
Note: See TracBrowser for help on using the repository browser.