Kompresja i Dekompresja

Kompresja i Dekompresja
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam takie programy do napisana jako prace domową

Program 1. Kompresja
Napisz program, który wczytuje ciąg znaków a następnie kompresuje go w następujący sposób:

  1. dzieli ciąg na bloki po trzy litery, każdą małą literę zamienia na wielką, cyfry na znak '^', pozostawia spacje, a wszystkie inne znaki na '_';
  2. każdy trzyliterowy blok zamienia na liczbę z zakresu 0..32767, tak że każdemu znakowi odpowiada jego kod ASCII zmniejszony o 64 (literze a lub A->1, literze z lub Z->26, znakowi ' '->29, znakowi ^->30, znakowi _->31); w bitach od 2 do 6 zapisany jest pierwszy znak, w bitach od 7 do 11 - drugi, a w bitach od 12 do 16 trzeci;
  3. jeśli blok jest ostatnim blokiem napisu - ustaw 'luźny' bit (najbardziej znaczący) na 1;
  4. wypisuje ciąg liczb na ekran.

Program 2. Dekompresja
Napisz program który wczyta sekwencję liczb z naturalnych mniejszych od 32768 i zamieni je z powrotem na tekst (ma to być operacja odwrotna do tej opisanej w poprzednim zadaniu). Program powinien czytać liczby tak długo, aż trafi na blok z ustawionym najbardziej znaczącym bitem - co oznacza koniec wczytywania danych.

I prawie udało mi się je zrobić ale wciąż nie mogę dojść jak zapisywać i odczytywać z konkretnych bitów. Czy ktoś mógłby być tak miły i wyjaśniłby mi to w jakiś przejrzysty sposób?

aurel
  • Rejestracja: dni
  • Ostatnio: dni
0

a w czym piszesz?

  • Rejestracja: dni
  • Ostatnio: dni
0

pascal

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Wzór będzie mniej więcej taki:
skompresowane = (znak1zakodowany << 10) + (znak2zakodowany << 5) + (znak3zakodowany) + (czyOstatniBlok ? -32768 : 0);

Dekompresja:
znak1zakodowany = (skompresowane >> 10) & 63;
znak2zakodowany = (skompresowane >> 5) & 63;
znak3zakodowany = (skompresowane) & 63;

  • Rejestracja: dni
  • Ostatnio: dni
0

Dziękuje za odpowiedź. A mógłbyś jeszcze wytłumaczyć dlaczego postępuje się w ten sposób?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Jeśli masz dwie wartości, odpowiednio m-bitowe i n-bitowe, to aby je połączyć najefektywniej najlepiej przesunąć pierwszą o n bitów w lewo i dodać drugą czyli wykonać (pierwszaWartość << n) + drugaWartość. Powstanie liczba (m+n) bitowa.

& to maskowanie. 63 to 11111 w systemie dwójkowym.

EDIT:
Oj, nie miało być 63 a 31.

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

Tyle, że w Pascalu nie masz operatora << tylko shl o ile dobrze pamiętam, jak to jest z bit and nie pamiętam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.