10
10
# #
11
11
###########################################################################
12
12
13
+ from tqdm import tqdm
14
+
13
15
RLE_MAX_BLKSIZE = 128
14
16
15
17
@@ -18,34 +20,40 @@ def to_byte(b):
18
20
19
21
20
22
def encode (data ):
21
- def check_block (data ):
23
+ def check_block (data , k ):
22
24
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 :
24
26
n += 1
25
- return n , data [0 ]
27
+ return n , data [k ]
26
28
27
29
print ('Performing RLE compression ...' )
28
30
orig_len = len (data )
29
31
30
32
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 )
49
57
50
58
comp_len = len (result )
51
59
comp_ratio = 100 * comp_len / orig_len
@@ -56,12 +64,18 @@ def check_block(data):
56
64
57
65
def decode (data ):
58
66
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
+
67
81
return result
0 commit comments