# Base64

Base64 is een manier om binaire code te converteren naar ASCII-tekens. De codering wordt onder meer gebruikt in e-mail om bijlagen te versturen (zie MIME), maar ook op andere manieren wordt het op internet gebruikt. De conversie naar ASCII is noodzakelijk omdat veel protocollen op internet gebouwd zijn op het gebruik van (7 bits) ASCII-tekens en niet van binaire code van 8 bits.
De inhoud van een binair bestand wordt vaak getoond in hexadecimale vorm, met 16 verschillende tekens (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E en F), waarbij elk teken vier bits vertegenwoordigt. Base64 is een zesbitscodering. Dat betekent dat er $2^{6}=64$ verschillende tekens zijn, vandaar de naam base64. Base64 is daardoor korter dan een hexadecimale codering, het heeft ongeveer 133% van de lengte van achtbitscodering, terwijl een hexadecimale codering twee keer zo lang is als de oorspronkelijke achtbitscodering.
Het gemeenschappelijke voordeel van base64- en hexadecimale codering is dat alle tekens visueel onderscheidbaar zijn. Dat zijn niet alle tekens die onder de ASCII-codering vallen (onder meer niet de eerste 33 ASCII-tekens, waaronder de spatie en de carriage return).

## Omzetten

Base64-codering kan worden toegepast op een willekeurige reeks bytes. Het algoritme voor de codering verwerkt de data in groepjes van drie bytes. Die bevatten 3 × 8 = 24 willekeurige bits. Die worden gehergroepeerd in vier bytes van 6 bits (4 × 6 is ook 24). Elke byte kan dan dus maar zes bits bevatten, de overige worden nul. Dat maakt 64 combinaties mogelijk. De 64 wordt vol gemaakt met het =-teken en de binaire nul. Daarmee kan ook een mouw worden gepast aan data worden omgezet naar leesbare tekens: hoofdletters, kleine letters en cijfers = 2 × 26 + 10 = 62 tekens, plus de slash en het plusteken.
Wanneer het aantal te coderen bytes geen veelvoud is van drie, worden er, afhankelijk van het aantal benodigde extra bits, twee of vier nullen achter gezet. Als er twee nullen zijn toegevoegd, wordt "=" achter het eindresultaat gezet, bij vier nullen komt er "==" achter.
Een voorbeeld met de tekenreeks "π ∈ ℝ", gecodeerd als UTF-8: 11001111 10000000 00100000 11100010 10001000 10001000 00100000 11100010 10000100 10011101
groeperen in groepen van zes:
110011 111000 000000 100000 111000 101000 100010 001000 001000 001110 001010 000100 100111 01
aanvullen van de laatste groep met vier nullen, totdat deze ook uit zes bits bestaat:
110011 111000 000000 100000 111000 101000 100010 001000 001000 001110 001010 000100 100111 010000
omzetten naar decimaal:
51 56 0 32 56 40 34 8 8 14 10 4 39 16
betreffende teken kiezen uit de base64-tekenreeks:
z 4 A g 4 o i I I O K E n Q
eindresultaat:
z4Ag4oiIIOKEnQ== (twee "="-tekens zijn toegevoegd, om uit te komen op een viervoud).
Een computer zet de getallen niet eerst om in decimaal, omdat computers zelf met het binaire systeem werken.
Het aantal tekens (inclusief de toegevoegde "="-tekens) in het eindresultaat is altijd een viervoud. Dit valt als volgt te beredeneren. Elke groep van drie bytes (24 bits) leidt tot vier groepen van zes bits en dus vier base64-tekens. Een losse byte leidt na aanvulling met vier nullen tot twee base64-tekens waarna er twee =-tekens toegevoegd worden. In totaal dus vier tekens. Twee losse bytes leiden na aanvullen met twee nullen tot drie base64-tekens waarna er één "="-teken toegevoegd wordt. In totaal dus ook vier tekens.

## Base58

Base58 is een variant van base64, waarbij zes tekens zijn weggelaten: 0OIl+/. De tekenreeks is dus:
    ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789.
Base58Check heeft dezelfde tekens, maar met de cijfers voorop:
    123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
waarbij de codering wat langer is door enkele controletekens uit dezelfde tekenset.
Deze laatste wordt onder meer gebruikt voor een bitcoinadres.