moze poeksperymentuj z takim algorytmem:
|x|L|L|L|L|L|L|L| |dana|
gdzie:
x - co robimy:
0 - bity L -> ile razy powtorzyc bajt "dana" (0 -> EOB - end of block)
1 - bity L -> dlugosc ciagu do skopiowania spod offsetu "dana" ustawionego wzgledem poczatku rozpakowanych danych
zaleta algorytmu - prosta dekompresja + obsluga blokow
wynik kompresji dla pierwszego przykladu to:
0x11, 0x31, 0x0f, 0x32, 0x8f, 0x0f, 0xb6, 0x0f, 0x01, 0x33, 0x89, 0x41, 0x96, 0x1f, 0x06, 0x34, 0xaa, 0x1b, 0x9b, 0x16, 0x0b, 0x31, 0x00
moglem sie machnac - recznie liczylem ;)
skompresowane 192 bajty do 23, bez zastosowania slownika (a wiec i bez potrzeby miejsca na niego ;)
tylko nie wiem jak tu program napisac by do tej postaci kompresowal - uwzgledniajac takie rzeczy jak np. konczacy/zaczynajacy rle (ktory wiadomo - jest szybszy w dekompresji)
jesli nie zalezy nam na speedzie dekompresji to mozna jeszcze w tym algorytmie conieco skompresowac ;) - np.
|x|L|L|L|L|L|D|D| |dana dla x != 0|
x = 0 -> bity L = ilos powtorzen, bity D = dana - 0x30
x = 1 -> j.w.
dekompresja bedzie wolniejsza (choc niewiele), ale za to pozwala na jeszcze lepsze upakowanie danych z twojego formatu (choc nieco komplikuje dekompresje).
wybieraj - mozliwosci jest znacznie wiecej ;)