1010# #
1111###########################################################################
1212
13+ from tqdm import tqdm
14+
1315RLE_MAX_BLKSIZE = 128
1416
1517
@@ -18,34 +20,40 @@ def to_byte(b):
1820
1921
2022def encode (data ):
21- def check_block (data ):
23+ def check_block (data , k ):
2224 n = 1
23- while len (data ) > n and data [n ] == data [0 ] and n < RLE_MAX_BLKSIZE :
25+ while ( len (data ) - k ) > n and data [k + n ] == data [k ] and n < RLE_MAX_BLKSIZE :
2426 n += 1
25- return n , data [0 ]
27+ return n , data [k ]
2628
2729 print ('Performing RLE compression ...' )
2830 orig_len = len (data )
2931
3032 result = b''
31- while len (data ):
32- tmp = b''
33- while len (data ) and len (tmp ) < RLE_MAX_BLKSIZE :
34- n , val = check_block (data )
35- if n > 2 :
36- data = data [n :]
37- break
38- elif n == 2 :
39- n = 1
40- data = data [n :]
41- tmp += to_byte (val )
42- if len (tmp ):
43- result += to_byte (len (tmp ) - 1 )
44- result += tmp
45- if n < 2 :
46- continue
47- result += to_byte ((n - 2 ) | 0x80 )
48- result += to_byte (val )
33+ with tqdm (total = orig_len , unit = 'B' , unit_scale = True , leave = False ) as pbar :
34+ k = 0
35+ last_k = k
36+ while k < len (data ):
37+ tmp = b''
38+ while k < len (data ) and len (tmp ) < RLE_MAX_BLKSIZE :
39+ n , val = check_block (data , k )
40+ if n > 2 :
41+ k += n
42+ break
43+ elif n == 2 :
44+ n = 1
45+ k += n
46+ tmp += to_byte (val )
47+ pbar .update (k - last_k )
48+ last_k = k
49+
50+ if len (tmp ):
51+ result += to_byte (len (tmp ) - 1 )
52+ result += tmp
53+ if n < 2 :
54+ continue
55+ result += to_byte ((n - 2 ) | 0x80 )
56+ result += to_byte (val )
4957
5058 comp_len = len (result )
5159 comp_ratio = 100 * comp_len / orig_len
@@ -56,12 +64,18 @@ def check_block(data):
5664
5765def decode (data ):
5866 result = b''
59- while (len (data )):
60- if data [0 ] & 0x80 :
61- result += to_byte (data [1 ]) * ((data [0 ] & 0x7f ) + 2 )
62- data = data [2 :]
63- else :
64- l = data [0 ] + 1
65- result += data [1 :l + 1 ]
66- data = data [l + 1 :]
67+ with tqdm (total = len (data ), unit = 'B' , unit_scale = True , leave = False ) as pbar :
68+ k = 0
69+ last_k = k
70+ while k < len (data ):
71+ if data [k ] & 0x80 :
72+ result += to_byte (data [k + 1 ]) * ((data [k ] & 0x7f ) + 2 )
73+ k += 2
74+ else :
75+ l = data [k ] + 1
76+ result += data [k + 1 :k + l + 1 ]
77+ k += l + 1
78+ pbar .update (k - last_k )
79+ last_k = k
80+
6781 return result
0 commit comments