Charger un fichier
  1. base64hub
  2. Apprendre Base64
  3. Base64 et les autres encodages
Explication

Base64, hex, Base32, Base58 et Base85 comparés

Chaque encodage binaire-texte fait un compromis entre la taille, la lisibilité et le jeu de caractères qu’il a le droit d’utiliser. Voici la même entrée dans neuf d’entre eux, avec leur surcoût de taille et leur jeu de caractères.

Tableau comparatif

Tous ces encodages transforment des octets quelconques en texte imprimable, et inversement, sans perte. Ils diffèrent par le nombre de caractères utilisés, par le choix de ces caractères et par l’augmentation de taille de la sortie.

EncodageAlphabetTaille de sortieSensible à la casseURL-safeUsages typiques
Hex (Base16)0-9 a-f200 %NonOuiHachages, adresses MAC, dumps d’octets, codes couleur
Base32 (RFC 4648)A-Z 2-7, remplissage =160 %Non (majuscules selon la spécification)Oui, sans =Secrets TOTP, adresses onion Tor, DNSSEC (base32hex)
Base58 (Bitcoin)1-9 A-Z a-z sauf 0 O I lenviron 137 %OuiOuiAdresses Bitcoin, CIDv0 IPFS (Qm…), clés Solana
Base64A-Z a-z 0-9 + /, remplissage =133 %OuiNonPièces jointes d’e-mails, data URI, PEM, payloads JSON
Base64URLA-Z a-z 0-9 - _133 %OuiOuiJWT, jetons d’URL, noms de fichiers
Ascii85! à u, plus z125 %OuiNonFlux PDF et PostScript
Z8585 car. dont .-:+=^!/*?&<>()[]{}@%$#125 %OuiNonClés CURVE de ZeroMQ
Base45 (RFC 9285)0-9 A-Z, espace, $%*+-./:150 %Non (majuscules seulement)NonQR codes, certificats COVID numériques de l’UE

La « taille de sortie » est la longueur encodée rapportée à la longueur de l’entrée, pour de grandes entrées. Base64 a besoin de 4 caractères pour 3 octets, Base32 de 8 pour 5, Base85 de 5 pour 4, Base45 de 3 pour 2. Base58 n’a pas de taille de bloc fixe : son ratio vaut log(256) / log(58), soit environ 1,366. Pour les chiffres exacts sur une entrée donnée, le calculateur de taille les affiche tous à la fois.

La même entrée dans chaque encodage

Voici la chaîne ASCII de 12 octets Hello world! encodée de neuf façons. Douze octets, c’est un multiple de 3 et de 4 : Base64 et les variantes de Base85 n’ont donc pas besoin de remplissage.

EncodageSortieLongueur
Hex48656c6c6f20776f726c642124
Base32JBSWY3DPEB3W64TMMQQQ====24 (20 sans remplissage)
Base32hex91IMOR3F41RMUSJCCGGG====24
Base58 (alphabet Bitcoin)2NEpo7TZRhna7vSvL17
Base64SGVsbG8gd29ybGQh16
Base45%69 VD82EK4F.KESTC18
Ascii8587cURD]j7BEbo8015
Z85nm=QNzY<mxA+]nf15
Base85 (RFC 1924 / git)NM&qnZy<MXa%^NF15

Base64URL est identique à Base64 ici, parce que la sortie ne contient ni + ni /. La différence n’apparaît que pour certains octets : fb ef be donne ++++ en Base64 et ---- en Base64URL.

La bibliothèque standard de Python couvre l’essentiel du tableau. z85encode a été ajouté dans Python 3.13 :

import base64

data = b"Hello world!"
print(data.hex())                           # 48656c6c6f20776f726c6421
print(base64.b32encode(data).decode())      # JBSWY3DPEB3W64TMMQQQ====
print(base64.b64encode(data).decode())      # SGVsbG8gd29ybGQh
print(base64.a85encode(data).decode())      # 87cURD]j7BEbo80
print(base64.b85encode(data).decode())      # NM&qnZy<MXa%^NF
print(base64.z85encode(data).decode())      # nm=QNzY<mxA+]nf

Base58 ne fait pas partie de la bibliothèque standard, mais il tient en quelques lignes, car c’est une simple conversion de base d’un grand entier :

B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

def b58encode(data: bytes) -> str:
    n = int.from_bytes(data, "big")
    out = ""
    while n:
        n, r = divmod(n, 58)
        out = B58[r] + out
    zeros = len(data) - len(data.lstrip(b"\0"))
    return "1" * zeros + out

print(b58encode(b"Hello world!"))   # 2NEpo7TZRhna7vSvL
print(b58encode(b"\0\0\x01"))       # 112

Chaque octet nul en tête devient un 1 littéral, parce qu’un grand entier ne peut pas garder la trace des zéros de tête. C’est pour cela que toutes les anciennes adresses Bitcoin dont l’octet de version vaut zéro commencent par 1.

Où chaque encodage est utilisé

Hex

L’hex consomme deux caractères par octet : c’est l’option la plus volumineuse ici, et la plus facile à lire. Chaque caractère correspond à exactement 4 bits, si bien que l’octet à la position n se trouve toujours aux caractères 2n et 2n+1. C’est pour cette propriété que les hachages, les sommes de contrôle et les dumps de débogage sont presque toujours en hex. Les décodeurs acceptent aussi bien DEADBEEF que deadbeef. Convertissez avec Base64 en hex et hex en Base64.

Base32

Base32 n’utilise que des lettres majuscules et les chiffres de 2 à 7. Il résiste aux systèmes insensibles à la casse (noms DNS, certains systèmes de fichiers, personnes qui tapent un code sur leur téléphone) et évite 0, 1 et 8, qui ressemblent à O, I et B. Les applications d’authentification stockent les secrets TOTP en Base32, et les adresses onion Tor v3 font 56 caractères Base32 en minuscules. La RFC 4648 définit aussi base32hex (0-9 A-V), qui conserve l’ordre de tri des octets d’origine. Essayez l’encodeur Base32.

Base58

Base58 est né avec Bitcoin. Il supprime 0, O, I et l (faciles à confondre) ainsi que + et / (qui cassent la sélection par double-clic et les URL). Les adresses Bitcoin y ajoutent un octet de version et une somme de contrôle de 4 octets, un format appelé Base58Check. Les hachages CIDv0 d’IPFS sont aussi en Base58, et comme ils commencent par les octets multihash 12 20, ils débutent toujours par Qm. Toute l’entrée étant traitée comme un seul nombre, le temps de conversion croît de façon quadratique avec la longueur : Base58 sert donc pour des valeurs courtes comme les clés et les hachages. Essayez l’encodeur Base58.

Ascii85, Z85 et le Base85 de git

La famille Base85 loge 4 octets dans 5 caractères, la plus dense des encodages largement pris en charge. Le revers, c’est l’alphabet : 85 caractères imprimables, cela implique des guillemets, des barres obliques inverses, <, > ou &, selon la variante.

  • Ascii85 (Adobe) utilise ! à u, encadre la sortie par <~ et ~> et écrit quatre octets nuls sous la forme d’un seul z. PostScript et PDF (le filtre ASCII85Decode) l’utilisent.
  • Z85 (ZeroMQ) choisit des caractères sûrs dans les littéraux de chaîne C et JSON, sans guillemets ni barre oblique inverse. Il exige une longueur d’entrée multiple de 4. Une clé CURVE de 32 octets fait 40 caractères.
  • Le Base85 de la RFC 1924 était une proposition de poisson d’avril pour les adresses IPv6. Son alphabet survit dans les patchs binaires de git et dans b85encode de Python.

L’outil Base85 gère les trois ; Z85 a sa propre page.

Base45

Base45 existe pour les QR codes. Le mode alphanumérique d’un QR code stocke exactement 45 caractères (chiffres, lettres majuscules, espace et $%*+-./:) à 5,5 bits chacun, contre 8 bits par caractère en mode octet. Base45 transforme 2 octets en 3 de ces caractères, ce qui coûte environ 3 % dans le QR code. Du texte Base64 doit passer par le mode octet et coûte 33 %. Le certificat COVID numérique de l’UE utilisait Base45 précisément pour cette raison. Essayez l’encodeur Base45.

Comment choisir

Prenez l’encodage qu’attend le destinataire. Une bibliothèque JWT veut du Base64URL, une application d’authentification du Base32, un portefeuille Bitcoin du Base58Check. Quand vous maîtrisez les deux extrémités, ces règles empiriques s’appliquent :

  • Des octets dans du JSON, du XML, un e-mail ou un corps HTTP : Base64. Chaque langage en a une implémentation intégrée rapide, et 33 % de surcoût sont acceptables.
  • Dans une URL, un cookie ou un nom de fichier : Base64URL sans remplissage.
  • Des personnes vont lire, saisir ou comparer la valeur : hex pour les hachages courts, Base32 si la casse risque de se perdre, Base58 si la valeur doit rester compacte et sans caractères qui se ressemblent.
  • Chaque octet compte et vous maîtrisez le décodeur : Z85 ou Ascii85.
  • QR codes : Base45.

Le compromis est toujours le même : un alphabet plus grand donne une sortie plus courte et davantage de caractères à échapper quelque part. Pour comprendre pourquoi Base64 grossit d’un tiers, voir le surcoût de taille de Base64. Pour la variante URL-safe, voir Base64 ou Base64URL.

FAQ

Quel encodage binaire-texte est le plus compact ?

Parmi les courants, Base85 (Ascii85 et Z85) avec 25 % de surcoût, puis Base64 avec 33 %. basE91 fait légèrement mieux, mais il est rarement pris en charge. Voir l’outil Base91 si vous en avez besoin.

Pourquoi Bitcoin utilise-t-il Base58 plutôt que Base64 ?

Base58 supprime 0, O, I, l, + et / : les adresses sont plus faciles à lire à voix haute, à recopier à la main et à sélectionner d’un double-clic dans un champ de texte. Le prix à payer est une conversion en grand nombre plus lente, sans importance pour des adresses de 25 octets.

La casse compte-t-elle en Base32 et en Base58 ?

L’alphabet de la RFC 4648 est en majuscules, et les décodeurs stricts rejettent les minuscules. Beaucoup acceptent les deux : Python demande casefold=True. Base58, lui, est sensible à la casse : a et A sont deux chiffres différents. L’hex est insensible à la casse dans pratiquement tous les décodeurs.

Peut-on convertir directement Base64 en Base58 ou en Base32 ?

Oui, en décodant en octets puis en encodant à nouveau. Les convertisseurs Base64 en Base58 et Base64 en Base32 font les deux étapes localement dans votre navigateur.

Continuer la lecture