Zadanie #1 - base64

(Terminem "piątkowym" dla zadania są drugie zajęcia laboratoryjne)

Kodowanie służy do identycznych celów, jak kodowanie UU, z tą jednak różnicą, że posługuje się innym alfabetem znaków oraz nie używa dodatkowych znaczników długości linii informacji zakodowanej, co pozwala oczekiwać, że wiadomość zakodowana kodem base64 będzie minimalnie mniejsza, niż zakodowana kodem UU.

Algorytm kodowania base64 oparty jest na tym samym pomyśle, co UU: wejściowy ciąg bitów dzieli się na paczki po 24 bity (3 oktety), a każdą z paczek dzieli się następnie na  porcje po 6 bitów. Każda wydzielona porcja jest traktowana jak liczba bez znaku z przedziału od 0 do 26-1 i kodowana w poniższy sposób:

0 A

17 R

34 i

51 z

1 B

18 S

35 j

52 0

2 C

19 T

36 k

53 1

3 D

20 U

37 l

54 2

4 E

21 V

38 m

55 3

5 F

22 W

39 n

56 4

6 G

23 X

40 o

57 5

7 H

24 Y

41 p

58 6

8 I

25 Z

42 q

59 7

9 J

26 a

43 r

60 8

10 K

27 b

44 s

61 9

11 L

28 c

45 t

62 +

12 M

29 d

46 u

63 /

13 N

30 e

47 v

 

14 O

31 f

48 w

=

15 P

32 g

49 x

 

16 Q

33 h

50 y

 

Uzyskany w wyniku zakodowany ciąg jest dzielony na linie o długości nie przekraczającej 76 znaków.

Sytuacje, które powstają przy kodowaniu ostatnich bajtów wejściowej informacji binarnej, obsługuje się następująco:

Przy odkodowywaniu wiadomości base64 można założyć, że wystąpienie znaku spoza alfabetu oraz innego niż \n lub \r oznacza koniec wiadomości.

Opis kodowania base64 zawiera RFC1421

Zadanie:

Napisz w dowolnym(*) języku programowania program o nazwie b64, pozwalający kodować i dekodować dane do/z formatu base64.

b64decode [-k|-d] plik_wej plik_wyj

Program ma otrzymywać trzy parametry: 

Diagnostyka błędów wykonania może być symboliczna, ale nie może być zerowa.
Kod powrotu z programu powinien co najmniej sygnalizować, czy program zakończył się sukcesem.

UWAGA!
Uwzględnij fakt, że program powinien akceptować dowolnie duże pliki (wszelkie założenia co do tego, że pliki wejściowe nie będą większe niż N, dyskwalifikują rozwiązanie, dlatego wczytywanie całego pliku do pamięci nie jest dobrym pomysłem).

Dla celów testowych możesz posłużyć się poniższymi parami plików (z pierwszego uzyskuje się drugi i vice versa).

plik png   <=>     plik base64
plik txz    <=>     plik base64

Traktuj ten zestaw testów jako absolutnie podstawowy. Sprawdź rzetelnie zachowanie swojego programu dla różnych długości plików wejściowych.

Uwaga: Użycie obcych narzędzi dekodujących base64 (funkcji, klas, programów, etc) jest zabronione i będzie skutkować radykalnym obniżeniem oceny.

(*) dowolnym w granicach rozsądku - raczej nie w BF