Kodowanie Base64 to proces konwertowania danych binarnych na format ciągu ASCII przez konwersję tych danych binarnych na 6-bitową reprezentację znaków. Metoda kodowania Base64 jest używana, gdy dane binarne, takie jak obrazy lub wideo, są przesyłane przez systemy zaprojektowane do przesyłania danych w formacie zwykłego tekstu (ASCII).
Dlaczego używane jest kodowanie Base64?
Potrzeba kodowania Base64 wynika z problemów, które pojawiają się, gdy media są przesyłane w nieprzetworzonym formacie binarnym do systemów tekstowych.
Ponieważ systemy tekstowe (takie jak poczta e-mail) interpretują dane binarne jako szeroki zakres znaków, w tym specjalne znaki poleceń, większość danych binarnych przesyłanych do nośnika jest błędnie interpretowana przez te systemy i tracona lub uszkadzana w proces transmisji.
Jedną z metod kodowania tego rodzaju danych binarnych w sposób, który pozwala uniknąć takich problemów z transmisją, jest wysłanie ich jako zwykłego tekstu ASCII w formacie zakodowanym w Base64. Jest to jedna z technik stosowanych przez standard MIME do wysyłania danych innych niż zwykły tekst.
Wiele języków programowania, takich jak PHP i Javascript, zawiera funkcje kodowania i dekodowania Base64 w celu interpretacji danych przesyłanych za pomocą kodowania Base64.
Logika kodowania Base64
Kodowanie Base64 dzieli dane binarne na 6-bitowe segmenty po 3 pełne bajty i przedstawia je jako drukowane znaki w standardzie ASCII. Robi to zasadniczo w dwóch krokach.
Pierwszym krokiem jest rozbicie ciągu binarnego na 6-bitowe bloki. Base64 używa tylko 6 bitów (co odpowiada 2^6=64 znaki), aby zapewnić, że zakodowane dane są możliwe do wydrukowania i czytelne dla człowieka. Żaden ze znaków specjalnych dostępnych w ASCII nie jest używany.
64 znaki (stąd nazwa Base64) to 10 cyfr, 26 małych liter, 26 wielkich liter, a także znak plus (+) i ukośnik (/). Istnieje również 65 znak znany jako pad, który jest znakiem równości (=). Ten znak jest używany, gdy ostatni segment danych binarnych nie zawiera pełnych 6 bitów.
Przykład kodowania Base64
Weźmy na przykład trzy liczby ASCII 155, 162 i 233. Te trzy liczby tworzą binarny strumień 100110111010001011101001. Plik binarny, podobnie jak obraz, zawiera binarny strumień składający się z dziesiątek lub setek tysięcy zer i jedynki.
Koder Base64 zaczyna się od podzielenia strumienia binarnego na grupy po sześć znaków: 100110 111010 001011 101001. Każda z tych grup przekłada się na liczby 38, 58, 11 i 41.
Sześcioznakowy strumień binarny konwertuje znaki binarne (o podstawie 2) na dziesiętne (o podstawie 10) przez podniesienie do kwadratu każdej wartości reprezentowanej przez 1 w sekwencji binarnej z jej kwadratem pozycyjnym. Zaczynając od prawej i przesuwając się w lewo i zaczynając od zera, wartości w strumieniu binarnym reprezentują 2^0, potem 2^1, potem 2^2, potem 2^3, potem 2^4, potem 2^5.
Oto inny sposób patrzenia na to. Zaczynając od lewej, każda pozycja jest warta 1, 2, 4, 8, 16 i 32. Jeśli liczba binarna ma 1 w gnieździe, dodajesz tę wartość; jeśli ma 0 w gnieździe, nie masz. Ciąg binarny 100110 zamienia się na liczbę dziesiętną 38: 02^01 + 12^1 + 12^2 + 02^3 + 02^4 + 12^5=0+2 +4+0+0+32.
Kodowanie Base64 bierze ten ciąg binarny i dzieli go na wartości 6-bitowe 38, 58, 11 i 41.
Na koniec liczby te są konwertowane na znaki ASCII przy użyciu tabeli kodowania Base64. Wartości 6-bitowe z tego przykładu są tłumaczone na sekwencję ASCII m6Lp.
Korzystanie z tabeli konwersji Base64:
- 38 to m
- 58 to 6
- 11 to L
- 41 to p
Ten dwuetapowy proces jest stosowany do całego zakodowanego ciągu binarnego.
Aby upewnić się, że zakodowane dane mogą być prawidłowo wydrukowane i nie przekraczają limitu długości linii żadnego serwera pocztowego, wstawiane są znaki nowego wiersza, aby długość linii nie przekraczała 76 znaków. Znaki nowej linii są kodowane tak jak wszystkie inne dane.
Całym celem kodowania Base64, od dodania dopełnienia w celu zachowania 3-bajtowych segmentów binarnych po konwersję binarną na tekst przy użyciu tabeli Base64, jest zachowanie integralności przesyłanych informacji binarnych.
Tabela kodowania Base64
Poniższa tabela tłumaczy wszystkie 64 znaki używane w kodowaniu Base64.
Tabela kodowania Base64 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Wartość | Char | Wartość | Char | Wartość | Char | Wartość | Char | |||
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | 55 | 3 | ||||
8 | I | 24 | T | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |
Rozwiązanie gry końcowej
Pod koniec procesu kodowania może wystąpić problem. Jeśli rozmiar oryginalnych danych w bajtach jest wielokrotnością trzech, wszystko działa dobrze. Jeśli tak nie jest, mogą być puste bajty. Do prawidłowego kodowania potrzebne są dokładnie 3 bajty danych binarnych.
Rozwiązaniem jest dodanie wystarczającej liczby bajtów o wartości 0, aby utworzyć grupę 3-bajtową. Dwie takie wartości są dołączane, jeśli dane wymagają jednego dodatkowego bajtu danych, jedna jest dodawana dla dwóch dodatkowych bajtów.
Oczywiście tych sztucznych końcowych zer nie można zakodować przy użyciu poniższej tabeli kodowania. Muszą być reprezentowane przez 65. znak. Znak dopełnienia Base64 to znak równości (=) i jest umieszczany na końcu zakodowanych danych.