Encodeur et décodeur Base85

Convertissez du texte, des octets hexadécimaux ou des fichiers en Base85, et inversement. Cette page utilise le jeu de caractères de la RFC 1924, la variante produite par Python b85encode et utilisée dans les patchs binaires de Git.

Fonctionne entièrement dans votre navigateur. Aucune donnée n’est envoyée.

Mode d’emploi

  1. Choisissez Encoder pour transformer du texte ou des octets en Base85, ou Décoder pour reconvertir du Base85 en données.
  2. Saisissez ou collez votre entrée, ou ouvrez un fichier. Passez l’entrée en Hexa si vous travaillez avec des octets bruts.
  3. Le résultat se met à jour pendant la saisie. Au décodage, choisissez la sortie Texte ou Hexa selon le contenu des données.
  4. Copiez le résultat ou téléchargez-le sous forme de fichier.

Qu’est-ce que Base85 ?

Base85 désigne une famille d’encodages qui transforment chaque groupe de 4 octets en 5 caractères. Cinq chiffres en base 85 peuvent représenter 85 × 85 × 85 × 85 × 85 = 4 437 053 125 valeurs, juste assez pour n’importe quel nombre de 32 bits : la sortie n’est donc que 25 % plus grande que l’entrée, contre 33 % pour Base64.

Il existe plusieurs alphabets Base85, qui ne sont pas interchangeables : Ascii85 (Adobe, PDF), Z85 (ZeroMQ) et celui de cette page. Ce dernier utilise 0-9, A-Z, a-z et 23 symboles : !#$%&()*+-;<=>?@^_`{|}~. Les guillemets simples et doubles, la virgule, le point, la barre oblique, les deux-points, la barre oblique inverse et les crochets en sont exclus.

RFC 1924, Git et Python

Le jeu de caractères provient de la RFC 1924, « A Compact Representation of IPv6 Addresses », publiée le 1er avril 1996 en guise de poisson d’avril. Elle proposait d’écrire une adresse IPv6 de 128 bits sous la forme d’un seul nombre en base 85 d’exactement 20 caractères. Personne n’écrit les adresses IPv6 ainsi, mais l’alphabet a ensuite été repris pour des données binaires quelconques :

  • Git stocke les fichiers binaires des patchs (git diff --binary, git format-patch) sous forme de données compressées avec zlib et encodées avec cet alphabet, avec un caractère de longueur au début de chaque ligne.
  • Python 3.4 et les versions ultérieures fournissent base64.b85encode() et b85decode(), dont la sortie correspond à celle de cet outil.
  • Mercurial utilise le même encodage pour les fichiers binaires dans les diffs au format Git.

Notez que la RFC 1924 convertit l’adresse de 128 bits d’un seul bloc, alors que Git, Python et cet outil travaillent par groupes de 4 octets : une valeur de 16 octets donne donc un résultat différent de celui obtenu avec la méthode de la RFC.

Groupes finaux incomplets

Lorsque la longueur de l’entrée n’est pas un multiple de 4, le dernier groupe est complété par des octets nuls, encodé, puis seuls ses n + 1 premiers caractères sont conservés : 1 octet donne 2 caractères, 2 octets en donnent 3 et 3 octets en donnent 4. Le décodeur inverse l’opération, si bien qu’aucun caractère de remplissage n’est nécessaire. Contrairement au z d’Ascii85, cette variante n’a pas de raccourci pour les octets nuls.

# Python 3.4+
import base64
base64.b85encode(b'hello')      # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv')    # b'hello'

Spécifications

Alphabet0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
Taille de sortie5 caractères pour 4 octets (125 %)
RemplissageAucun
NormeJeu de caractères de la RFC 1924 (Git, Python b85)
Sensible à la casseOui

Exemples

Entrée (UTF-8)Sortie
Hello, World!NM&qnZ!92JZ*pv8Ap
Base64.isLSb`dHZ(42a{
你好<h`KfrM&

Questions fréquentes

Base85 est-il identique à Ascii85 ?
Ils reposent sur le même calcul mais pas sur les mêmes caractères : leurs sorties diffèrent. Ascii85 abrège en outre quatre octets nuls en z et peut être entouré des délimiteurs Adobe. Utilisez la page Ascii85 pour les données PDF et PostScript.
La RFC 1924 était-elle une vraie norme ?

Non. C’est une RFC informative publiée comme poisson d’avril, qui n’a jamais servi pour les adresses IPv6. Son jeu de caractères est devenu populaire plus tard grâce à Git et Python.

De combien la sortie Base85 est-elle plus grande ?
Chaque groupe de 4 octets devient 5 caractères : la sortie fait donc 1,25 fois la taille de l’entrée, contre environ 1,33 fois pour Base64. basE91 est encore un peu plus compact.
Puis-je placer du Base85 dans du JSON ou du XML ?
En JSON, oui : l’alphabet ne contient ni guillemet double ni barre oblique inverse, donc rien n’est à échapper. En XML et en HTML, les caractères <, > et & doivent être échappés. Base85 n’est pas compatible URL.