source: icGREP/icgrep-devel/QA/lz4d_ext_dep/decoder/SequenceDecoder.py @ 5908

Last change on this file since 5908 was 5864, checked in by xwa163, 20 months ago

Add LZ4D extract deposit related kernel, target and test cases

File size: 2.6 KB
Line 
1
2def decode(file, block_info, options):
3    result = bytearray()
4    for info in block_info:
5        result = __process_block(file, info["is_compressed"], info["block_start"], info["block_end"], result, options)
6    # return result.decode()
7    return result
8
9def __process_block(file, is_compressed, block_start, block_end, previous_result, options):
10
11    result = previous_result
12    if not is_compressed:
13        # TODO handle uncompressed block
14        return result
15
16    current_pos = block_start
17    while current_pos < block_end:
18        token_byte = file[current_pos]
19        # print(hex(current_pos))
20
21        literal_token = token_byte >> 4
22        match_token = token_byte & 15
23        current_pos += 1
24
25        # Literal Copy
26
27        if literal_token != 0:
28            literal_length = literal_token
29            if literal_token == 15:
30                # Extend Literal Length
31                while True:
32                    v = file[current_pos]
33                    literal_length += v
34                    current_pos += 1
35                    if v != 255:
36                        break
37            literal_start = current_pos
38            result += file[literal_start: literal_start + literal_length]
39            current_pos += literal_length
40            # print(literal_length + literal_start)
41
42            # print("literalStart                             = " + str(hex(literal_start))[2:])
43            # print("literalLength                            = " + str(hex(literal_length))[2:])
44        else:
45            pass
46            # print("literalStart                             = " + str(hex(current_pos))[2:])
47            # print("literalLength                            = 0")
48        if current_pos < block_end:
49            # Match Copy
50            match_length = match_token + 4
51            match_offset = file[current_pos] + (file[current_pos + 1] << 8)
52            current_pos += 2
53            # print("matchOffset                              = " + str(hex(match_offset))[2:])
54
55            if match_token == 15:
56                # Extend Match Length
57                while True:
58                    v = file[current_pos]
59                    match_length += v
60                    current_pos += 1
61                    if v != 255:
62                        break
63
64            # Match Copy
65            for i in range(match_length):
66                if "extract_only" in options and options['extract_only']:
67                    pass
68                elif "extract_and_deposit_only" in options and options["extract_and_deposit_only"]:
69                    result.append(0)
70                else:
71                    result.append(result[len(result) - match_offset])
72    return result
Note: See TracBrowser for help on using the repository browser.