Base64-kodning er en proces til at konvertere binære data til et ASCII-strengformat ved at konvertere disse binære data til en 6-bit tegnrepræsentation. Base64-kodningsmetoden bruges, når binære data, såsom billeder eller video, transmitteres over systemer, der er designet til at transmittere data i et almindeligt tekstformat (ASCII).
Hvorfor bruges Base64-kodning?
Behovet for Base64-kodning kommer fra de problemer, der opstår, når medier transmitteres i rå binært format til tekstbaserede systemer.
Da tekstbaserede systemer (som e-mail) fortolker binære data som en bred vifte af tegn, inklusive specielle kommandotegn, bliver meget af de binære data, der transmitteres til overførselsmedier, fejlfortolket af disse systemer og tabt eller ødelagt i transmissionsprocessen.
En metode til at kode denne slags binære data på en måde, der undgår sådanne transmissionsproblemer, er at sende dem som almindelig ASCII-tekst i Base64-kodet format. Dette er en af de teknikker, der anvendes af MIME-standarden til at sende andre data end almindelig tekst.
Mange programmeringssprog, såsom PHP og Javascript, inkluderer Base64-kodnings- og afkodningsfunktioner for at fortolke data transmitteret ved hjælp af Base64-kodning.
Base64-kodningslogik
Base64-kodning opdeler binære data i 6-bit segmenter på 3 fulde bytes og repræsenterer dem som printbare tegn i ASCII-standard. Det gør den i hovedsageligt to trin.
Det første trin er at bryde den binære streng ned i 6-bit blokke. Base64 bruger kun 6 bit (svarende til 2^6=64 tegn) for at sikre, at kodede data kan udskrives og læses af mennesker. Ingen af de speci altegn, der er tilgængelige i ASCII, bruges.
De 64 tegn (deraf navnet Base64) er 10 cifre, 26 små bogstaver, 26 store bogstaver samt plustegnet (+) og skråstregen frem (/). Der er også et 65. tegn kendt som en pad, som er lighedstegnet (=). Dette tegn bruges, når det sidste segment af binære data ikke indeholder hele 6 bits.
Base64-kodningseksempel
Tag f.eks. tre ASCII-tal 155, 162 og 233. Disse tre tal udgør en binær strøm på 1001101110100010111101001. En binær fil, som et billede, indeholder en binær strøm, der kører for titusinder eller hundredtusindvis af nuller og en.
En Base64-koder starter med at dele den binære strøm i grupper på seks tegn: 100110 111010 001011 101001. Hver af disse grupperinger oversættes til tallene 38, 58, 11 og 41.
En binær strøm på seks tegn konverterer mellem binære (eller grundtal-2) til decim altegn (base-10) ved at kvadrere hver værdi repræsenteret af et 1 i den binære sekvens med dens positionelle kvadrat. Startende fra højre og bevæger sig til venstre, og startende med nul, repræsenterer værdierne i den binære strøm 2^0, så 2^1, så 2^2, så 2^3, så 2^4, så 2^5.
Her er en anden måde at se det på. Startende fra venstre er hver position værd 1, 2, 4, 8, 16 og 32. Hvis det binære tal har et 1 i pladsen, tilføjer du denne værdi; hvis den har 0 i åbningen, har du ikke. Den binære streng 100110 konverteres til decim altallet 38: 02^01 + 12^1 + 12^2 + 02^3 + 02^4 + 12^5=0+2 +4+0+0+32.
Base64-kodning tager denne binære streng og opdeler den i 6-bit værdierne 38, 58, 11 og 41.
Til sidst konverteres disse tal til ASCII-tegn ved hjælp af Base64-kodningstabellen. 6-bit værdierne i dette eksempel oversættes til ASCII-sekvensen m6Lp.
Brug af Base64-konverteringstabellen:
- 38 er m
- 58 er 6
- 11 er L
- 41 er p
Denne to-trins proces anvendes på hele den binære streng, der er kodet.
For at sikre, at de kodede data kan udskrives korrekt og ikke overskrider nogen mailservers linjelængdegrænse, indsættes nye linjetegn for at holde linjelængder under 76 tegn. Nylinjetegnene er kodet som alle andre data.
Hele formålet med Base64-kodning, fra tilføjelse af polstring for at bevare 3-byte binære segmenter til konvertering af binær til tekst ved hjælp af Base64-tabellen, er at bevare integriteten af den transmitterede binære information.
Base64-kodningstabel
Den følgende tabel oversætter alle 64 tegn, der bruges i Base64-kodning.
Base64-kodningstabel | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Value | Char | Value | Char | Value | Char | Value | 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 | Y | 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 | / |
Solving the Endgame
I slutningen af kodningsprocessen kan der være et problem. Hvis størrelsen af de originale data i bytes er et multiplum af tre, fungerer alt fint. Hvis det ikke er det, kan der være tomme bytes. For korrekt kodning kræves der nøjagtig 3-bytes binære data.
Løsningen er at tilføje nok bytes med en værdi på 0 til at oprette en 3-byte gruppe. To sådanne værdier tilføjes, hvis data har brug for én ekstra byte data, én tilføjes for to ekstra bytes.
Selvfølgelig kan disse kunstige efterfølgende '0'er ikke kodes ved hjælp af indkodningstabellen nedenfor. De skal være repræsenteret af et 65. tegn. Base64-udfyldningstegnet er lighedstegnet (=) og placeres i slutningen af kodede data.