Charger un fichier
  1. base64hub
  2. Autres bases
  3. Base45

Encodeur et décodeur Base45 (RFC 9285)

Tapez du texte pour obtenir du Base45 RFC 9285, construit à partir des 45 caractères qu’un QR code stocke en mode alphanumérique. Inversez le sens pour décoder du Base45, par exemple la partie d’un certificat sanitaire HC1: qui suit le préfixe.

Gratuit sans inscription, sans limites Local rien n'est envoyé RFC 9285 tous les exemples de la RFC reproduits Mis à jour 27 oct. 2026
Entrée 0Octets 0 BSortie 0

Traité dans votre navigateur. Cette page ne peut envoyer vos données nulle part – comment le savons-nous

Comment encoder et décoder du Base45

  1. Tapez ou collez du texte dans Entrée · Texte. La chaîne Base45 apparaît dans Sortie · Base45 (RFC 9285).
  2. Pour des données binaires, comme des octets compressés, réglez d’abord De sur Hex ou Base64.
  3. Pour décoder, cliquez sur Base45 (RFC 9285) → Texte dans le sélecteur de sens et collez la chaîne. Choisissez Hex ou Base64 sous Vers si le résultat est binaire, ce qui est le cas des certificats sanitaires.
  4. Copier la sortie conserve les espaces. Enregistrer les octets télécharge les octets décodés sous forme de fichier.

Comment fonctionne Base45

La RFC 9285 prend l’entrée deux octets à la fois. Chaque paire est un nombre n de 0 à 65535, écrit sous forme de trois chiffres en base 45 c, d, e avec n = c + d × 45 + e × 45², le moins significatif en premier. Un dernier octet isolé devient deux chiffres. L’alphabet est le jeu alphanumérique des QR codes, dans l’ordre :

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:

Les exemples de la RFC, tous reproduits par cet outil :

EntréeBase45
ABBB8
Hello!!%69 VD92EX0
base-45UJCLQE7W581
ietf!QED8WEX0

Le décodage vérifie deux choses qu’un décodeur tolérant pourrait ignorer : une longueur de 3n + 1 ne peut provenir d’aucune entrée, et un groupe supérieur à 65535 (comme GGW ou ZZZ) est hors limites. Les deux provoquent une erreur.

Pourquoi Base45 convient aux QR codes

Sur le papier, Base45 semble gaspilleur : 3 caractères pour 2 octets, c’est 50 % de surcoût, plus que les 33 % de Base64. La différence vient de la façon dont les QR codes stockent le texte. En mode alphanumérique, un QR code place deux de ces 45 caractères dans 11 bits. Trois caractères Base45 coûtent donc 16,5 bits pour 16 bits de données, soit environ 3 % de surcoût.

Base64 ne peut pas utiliser le mode alphanumérique, car il a besoin de lettres minuscules. Il doit passer en mode octet à 8 bits par caractère, soit 33 % de surcoût dans le QR code. Pour les mêmes données, le QR code en Base45 est plus petit ou en contient davantage.

Décoder un certificat COVID numérique de l’UE (HC1:)

Le QR code du certificat COVID numérique de l’UE contient une chaîne qui commence par HC1:. Le payload est construit en couches, et cette page en traite une :

  1. Retirez le préfixe HC1:. H, C, 1 et : sont tous des caractères Base45 valides : un préfixe laissé en place est décodé comme des données et casse tout ce qui suit.
  2. Décodez le reste en Base45 ici, avec Vers réglé sur Base64.
  3. Décompressez le résultat. Ce sont des données zlib, qui commencent par l’octet 78 (eJ ou eN en Base64). Collez le Base64 dans le décodeur gzip et zlib.
  4. Analysez le CBOR. Les octets décompressés sont une structure COSE_Sign1 en CBOR : un en-tête, le payload avec les champs du certificat, et une signature. Il faut pour cela un décodeur CBOR, que ce site ne propose pas.

Le décodage montre le contenu, mais ne vérifie pas la signature. Vérifier qu’un certificat est authentique demande la clé publique du pays émetteur et un vérificateur COSE.

Base45 en Python

Python n’a pas de module Base45 dans sa bibliothèque standard. L’encodeur suit directement la RFC :

ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"

def b45encode(data: bytes) -> str:
    out = []
    for i in range(0, len(data) - 1, 2):
        n = data[i] * 256 + data[i + 1]
        c, n = n % 45, n // 45
        d, e = n % 45, n // 45
        out += ALPHABET[c], ALPHABET[d], ALPHABET[e]
    if len(data) % 2:
        c, d = data[-1] % 45, data[-1] // 45
        out += ALPHABET[c], ALPHABET[d]
    return "".join(out)

b45encode(b"ietf!")    # 'QED8WEX0'

Le paquet base45 sur PyPI fournit les deux sens. Pour d’autres manipulations d’octets en Python, voir la page Python.

FAQ

Pourquoi la sortie Base45 contient-elle des espaces ?

L’espace fait partie des 45 caractères du jeu alphanumérique des QR codes : c’est un chiffre ordinaire en Base45, de valeur 36. Hello!! s’encode en %69 VD92EX0. Gardez les espaces quand vous copiez, et ne laissez pas un formulaire ou un shell les supprimer.

Puis-je décoder un certificat COVID numérique de l'UE ici ?

En partie. Cette page fait l’étape Base45. Ensuite, les données sont du CBOR compressé en zlib dans une structure COSE signée, ce qui demande une décompression et un décodeur CBOR ; les étapes sont décrites sur cette page.

Peut-on mettre du Base45 dans une URL ?

Non. L’espace, %, + et / font partie de l’alphabet et ont tous un sens dans les URL. Encodez la chaîne en pourcent ou utilisez Base64URL pour les URL.

Pourquoi ma chaîne Base45 est-elle rejetée ?

Un Base45 valide a une longueur de 3n ou 3n + 2 caractères, et chaque groupe de 3 caractères doit valoir au plus 65535. Une longueur de 3n + 1, ou un groupe comme GGW, est une erreur. Un préfixe HC1: oublié en est une cause fréquente.