Jeśli internet jest autostradą informacyjną, ścieżka do poczty e-mail to wąski wąwóz. Tylko bardzo małe wózki mogą przejść.
System transportu wiadomości e-mail został zaprojektowany wyłącznie dla zwykłego tekstu ASCII. Próba wysłania tekstu w innych językach lub dowolnych plików jest jak przeniesienie ciężarówki przez wąwóz.
Jak Wielka Ciężarówka przechodzi przez Wąwóz?
Więc jak wysłać dużą ciężarówkę przez mały wąwóz? Musisz złożyć go na kawałki z jednego końca, przetransportować kawałki przez wąwóz i odbudować ciężarówkę z kawałków na drugim końcu.
To samo dzieje się, gdy wysyłasz załącznik do pliku przez e-mail. W procesie znanym jako kodowanie danych binarnych przekształcany jest tekst ASCII, który można bez problemu transportować pocztą elektroniczną. Po stronie odbiorcy dane są dekodowane, a oryginalny plik jest ponownie tworzony.
Jedną z metod kodowania dowolnych danych jako zwykłego tekstu ASCII jest Base64. Jest to jedna z technik wykorzystywanych przez standard MIME do wysyłania danych innych niż zwykły tekst.
Base64 na ratunek
Kodowanie Base64 zajmuje trzy bajty, z których każdy składa się z ośmiu bitów i reprezentuje je jako cztery drukowane znaki w standardzie ASCII. Czyni to zasadniczo w dwóch etapach.
Pierwszym krokiem jest zamiana trzech bajtów na cztery liczby sześciu bitów. Każda postać w standardzie ASCII składa się z siedmiu bitów. Base64 używa tylko 6 bitów (co odpowiada 2 ^ 6 = 64 znaków), aby zapewnić, że zakodowane dane są drukowane i czytelne dla człowieka. Nie są używane żadne znaki specjalne dostępne w ASCII.
64 znaki (stąd nazwa Base64) to 10 cyfr, 26 małych liter, 26 wielkich liter oraz "+" i "/".
Jeśli na przykład trzy bajty to 155, 162 i 233, odpowiadający (i przerażający) strumień bitów to 100110111010001011101001, który z kolei odpowiada 6-bitowym wartościom 38, 58, 11 i 41.
Numery te są konwertowane na znaki ASCII w drugim etapie przy użyciu tabeli kodowania Base64. 6-bitowe wartości naszego przykładu tłumaczą się na sekwencję ASCII "m6Lp".
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> str
Ten dwuetapowy proces jest stosowany do całej sekwencji bajtów, które są kodowane. Aby zapewnić prawidłowe drukowanie zakodowanych danych i nie przekraczać limitu długości linii serwera pocztowego, wprowadza się znaki nowego wiersza, aby długość linii nie przekraczała 76 znaków. Znaki nowego wiersza są kodowane tak jak wszystkie inne dane.
Rozwiązywanie Endgame
Pod koniec procesu kodowania może pojawić się problem. Jeśli rozmiar oryginalnych danych w bajtach jest wielokrotnością trzech, wszystko działa poprawnie. Jeśli nie, możemy otrzymać jeden lub dwa 8-bitowe bajty. Jednak w celu prawidłowego kodowania potrzebujemy dokładnie trzy bajty.
Rozwiązaniem jest dołączenie wystarczającej liczby bajtów o wartości "0", aby utworzyć grupę 3-bajtową. Dwie takie wartości są dołączane, jeśli mamy jeden dodatkowy bajt danych, jeden jest dołączany do dwóch dodatkowych bajtów.
Oczywiście te sztuczne końcowe '0' nie mogą być zakodowane za pomocą poniższej tabeli kodowania. Muszą być reprezentowani przez 65. postać.
Znak paddingu Base64 to "=". Oczywiście może pojawić się tylko na końcu zakodowanych danych.
Tabela kodowania Base64
Wartość | Zwęglać | Wartość | Zwęglać | Wartość | Zwęglać | Wartość | Zwęglać | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | ZA | 16 | Q | 32 | sol | 48 | w | |||
1 | b | 17 | R | 33 | h | 49 | x | |||
2 | do | 18 | S | 34 | ja | 50 | y | |||
3 | re | 19 | T | 35 | jot | 51 | z | |||
4 | mi | 20 | U | 36 | k | 52 | 0 | |||
5 | fa | 21 | V | 37 | l | 53 | 1 | |||
6 | sol | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | ja | 24 | Y | 40 | o | 56 | 4 | |||
9 | jot | 25 | Z | 41 | str | 57 | 5 | |||
10 | K | 26 | za | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | do | 44 | s | 60 | 8 | |||
13 | N | 29 | re | 45 | t | 61 | 9 | |||
14 | O | 30 | mi | 46 | u | 62 | + | |||
15 | P | 31 | fa | 47 | v | 63 | / |