Table of Contents

HW 04 - RLE kodér

Termín odevzdání 5.11.2021 22:00 PT
Bodový zisk 4b
Počet uploadů 10 15
Typ zadání povinné
Tato úloha slouží k procvičení cyklů a podmínek, není třeba používat pole (řešení bez použití pole je preferováno).

RLE kódování

RLE (run-length encoding) je bezeztrátová komprese, která kóduje vstupní data tak, že kóduje posloupnosti stejných hodnot do dvojic (délka posloupnosti, hodnota). Účinnost komprese je silně závislá na charakteru vstupních dat, která musí obsahovat delší sekvence stejných znaků, jinak výrazně účinnost komprese klesá.

Příklad vstupních dat kodéru RLE:

WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW

Výsledek kódování RLE (není výstupem programu řešícího HW04, pouze demonstrační):

W12B1W12B3W24B1W14

Implementace

Nejčastější implementace je komprese bytového proudu. Implementuje se pomocí dvojic bytů, jeden byte udává hodnotu kódovaného bytu (symbol), druhý byte určuje počet opakování. Nevýhoda je, že pro jeden neopakující se symbol v proudu bytů se kóduje tato hodnota pomocí dvojice bytů, proto pro nevhodná vstupní data může být komprese neúčinná a velikost proudu z výstupu kóderu RLE až dvojnásobná oproti vstupu. Proto pro naší implementaci zvolíme následující pravidla:

a) kódování neopakujícího se symbolu

A ⇒ A

b) kódování symbolů s jedním opakováním

AA ⇒ AA

c) kódování sekvence 3 - 255 stejných symbolů

AAA ⇒ A3

d) pro sekvence delší než 255 stejných symbolů proběhne kódování 'nadvakrát'. Následující příklad je zkáceným zápisem zakódování 257 znaků 'A'

A..A ⇒ A255AA

Aby bylo kódování efektivní, mělo by probíhat v binárním režimu, takže místo ASCII číslic se budou do výstupního proudu zapisovat přímo hodnoty bytů. Pak je třeba ověřit správnost výsledku v editoru, který umí zobrazit binární podobu souboru. Následující příklad ukazuje zakódování 66 opakování symbolu A (pro připomenutí, znak B má číselnou podobu v ASCII tabulce 66):

$ cat file.in
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
$ ./hw04 < file.in > file.out
$ cat file.out
AB
$ hexdump -C file.out
00000000  41 42 0a                                          |AB.|
00000003

V rámci tohoto domácího úkolu budeme místo binárního vyjádření počtu opakování používat dekadické číslice v ASCII kódování; bude jednodušší vizuální i automatická kontrola. Při výpočtu kompresního poměru pak ale bude třeba počítat s tím, že čísla větší než 9 jsou reprezentovány dvěma a více byty v ASCII kódování.

Povinné zadání

Pro zobrazení šestnáctkového výstupu je použit následující příkaz:

$ hexdump -v -e '1/1 "%02X "' pub01.out

Příklad 1 - pub01

Vstupní hodnoty (stdin) Výstup (stdout) Chybový výstup (stderr) Návratová hodnota
BWWBBBWWWWWWWBBBBBBBWWWBBBWWWWBBBWWWWWWBBBBBBBBBWWWWWWBBBBBB
BWWB3W7B7W3B3W4B3W6B9W6B6
Pocet vstupnich symbolu: 60
Pocet zakodovanych symbolu: 25
Kompresni pomer: 0.42
0

Příklad 2 - pub02

Vstupní hodnoty (stdin) Výstup (stdout) Chybový výstup (stderr) Návratová hodnota
ABC
ABC
Pocet vstupnich symbolu: 3
Pocet zakodovanych symbolu: 3
Kompresni pomer: 1.00
0

Příklad 3 - pub03

Vstupní hodnoty (stdin) Výstup (stdout hex) Chybový výstup (stderr) Návratová hodnota
AABTTT
AABT3
Pocet vstupnich symbolu: 6
Pocet zakodovanych symbolu: 5
Kompresni pomer: 0.83
0

Příklad 4 - pub04

Vstupní hodnoty (stdin) Výstup (stdout) Chybový výstup (stderr) Návratová hodnota
ABBbdfbYYYY
ABB
Error: Neplatny symbol!
100

Odevzdání

Veřejné příklady + Makefile: hw04_-_rle.zip

Povinné zadání
Název v BRUTE HW04
Odevzdávané soubory main.c
Argumenty při spuštění žádné
Kompilace pomocí clang -Wno-error=gnu-case-range -pedantic -Wall -Werror -std=c99 -O3
Procvičované oblasti cykly a podmínky