Base 64 je kódování, které reprezentuje libovolnou posloupnost bajtů (bajt = 8 bitů) jako ASCII řetězec.

Kódování Base 64 se používá tam, kde je potřeba přenést binární data po kanálu, který je schopen přenášet ASCII, ale nikoliv libovolná binární data. Může to být například proto, že některé posloupnosti bitů mohou být přenosovými komponentami (např. dříve modemy) interpretovány jako speciální instrukce.

Každých 24 bitů (tři bajty) na vstupu je rozděleno na čtyři části po šesti bitech (€24 / 4 = 6€). Každé toto šestibitové číslo v rozsahu 0 (000000) až 63 (111111) slouží jako index do této tabulky znaků:

BitySymbolBitySymbolBitySymbolBitySymbol
000000A010000Q100000g110000w
000001B010001R100001h110001x
000010C010010S100010i110010y
000011D010011T100011j110011z
000100E010100U100100k1101000
000101F010101V100101l1101011
000110G010110W100110m1101102
000111H010111X100111n1101113
001000I011000Y101000o1110004
001001J011001Z101001p1110015
001010K011010a101010q1110106
001011L011011b101011r1110117
001100M011100c101100s1111008
001101N011101d101101t1111019
001110O011110e101110u111110+
001111P011111f101111v111111/

Pokud délka vstupu není dělitelná číslem 24, mohou nastat tyto možnosti:

  • zbývající délka je 8 bitů:
    • binární řetězec se doplní čtyřmi nulami, aby jeho délka byla 12
    • podle tabulky se zakódují dva znaky: €(8+4) / 6 = 2€
    • zakódovaná čtveřice znaků se doplní dvěmi rovnítky: ==
  • zbývající délka je 16 bitů:
    • binární řetězec se doplní dvěma nulami, aby jeho délka byla 18
    • podle tabulky se zakódují tři znaky: €(16+2) / 6 = 3€
    • zakódovaná čtveřice znaků se doplní jedním rovnítkem: =

Těmto úpravám se říká "padding" a některé implementace kódování si umí poradit i bez nich, avšak standard je předepisuje.

Pokud výsledný řetězec uložíme jako ASCII, kódování ve výsledku převede každou trojici bajtů na čtveřici, takže bude poměr délky výstupu k délce vstupu 4:3. Délka v bitech se tedy zvětší zhruba o třetinu.

Příklady

Kódování "01000010011100100110111001101111"

Nejprve každých 24 bitů na vstupu rozdělíme na čtyři části po šesti bitech. Protože je řetězec dlouhý 32 bitů a není dělitelný číslem 24, musíme provést padding. To znamená, že zbývajících osm bitů doplníme čtyřmi nulami, abychom mohli použít kódovací tabulku, a rezervujeme místo pro dvě chybějící šestice.

010000 100111 001001 101110, 011011 11[0000] [??????] [??????]

Každou šestici teď zakódujeme pomocí kódovací tabulky a poslední dvě chybějící šestice nahradíme rovnítky podle standardu:

QnJubw==

Dekódování "QnJubw=="

Pomocí kódovací tabulky zapíšeme binární hodnoty všech znaků. Rovnítka přeskočíme, protože představují chybějící šestice.

010000 100111 001001 101110 011011 110000

Jelikož zakódovaný řetězec končil dvěma rovnítky (==), lze jednoznačně odvodit, že do původního binárního řetězce byly doplněny čtyři nuly (viz zdůvodnění výše). Tyto nuly proto odebereme a získáme původní binární řetězec:

01000010011100100110111001101111

Varianty

Existuje varianta Base 64 URL, která je shodná s Base 64 až na dva poslední znaky v tabulce:

BitySymbol
111110- (mínus)
111111_ (podtržítko)

Tato varianta se používá primárně pro URL a názvy souborů, protože neobsahuje žádné problematické znaky.

Reference