Aller au contenu
🛠️ToolsShed

Base85 Encoder / Decoder

Encoder et décoder le texte à l'aide de l'encodage Base85 (ASCII85) et RFC 1924.

À propos de Base85

Base85 encode les données binaires en utilisant 85 caractères ASCII imprimables. ASCII85 est utilisé dans PDF et PostScript. RFC 1924 utilise un ensemble de caractères différent.

À propos de cet outil

Base85 est un système d'encodage binaire-vers-texte qui convertit des données brutes en texte ASCII lisible, idéal pour transmettre des informations binaires par des canaux texte uniquement. Contrairement à Base64, qui étend les données de 33%, Base85 est beaucoup plus efficace en espace, n'ajoutant qu'environ 25% à la taille du fichier—un avantage significatif lorsqu'il s'agit de travailler avec des charges volumineuses comme des images ou des pièces jointes de documents.

Pour utiliser cet outil, choisissez simplement votre variante d'encodage (ASCII85 est le standard Adobe utilisé dans les PDF et PostScript; RFC 1924 est une alternative orientée réseau), puis sélectionnez le mode d'encodage ou de décodage. Collez votre texte ou vos données encodées, cliquez sur le bouton, et le résultat s'affiche avec une comparaison de taille montrant exactement l'espace que consomme la version encodée.

Base85 brille dans les contextes spécialisés où l'efficacité et la sécurité du texte importent tous deux : les PDF stockant des polices intégrées, les graphiques PostScript dans les flux de travail d'impression, ou les protocoles réseau nécessitant des représentations compactes de données binaires. Bien que Base64 reste plus universellement supporté, Base85 est le choix standard lorsque vous avez besoin de minimiser la taille de sortie sans sacrifier la portabilité.

Questions Fréquentes

Implémentation du Code

import struct

def encode_ascii85(data: bytes) -> str:
    result = []
    for i in range(0, len(data), 4):
        chunk = data[i:i+4]
        padded = chunk.ljust(4, b'\x00')
        n = struct.unpack('>I', padded)[0]
        if n == 0 and len(chunk) == 4:
            result.append('z')
        else:
            chars = []
            for _ in range(5):
                chars.append(chr(n % 85 + 33))
                n //= 85
            result.extend(reversed(chars[:len(chunk)+1]))
    return '<~' + ''.join(result) + '~>'

def decode_ascii85(s: str) -> bytes:
    s = s.strip()
    if s.startswith('<~') and s.endswith('~>'):
        s = s[2:-2]
    result = bytearray()
    i = 0
    while i < len(s):
        if s[i] == 'z':
            result.extend(b'\x00' * 4); i += 1
        else:
            chunk = s[i:i+5]
            n = sum((ord(c) - 33) * (85 ** (4 - j)) for j, c in enumerate(chunk))
            result.extend(struct.pack('>I', n)[:len(chunk)-1])
            i += 5
    return bytes(result)

text = "Hello, World!"
encoded = encode_ascii85(text.encode())
print("Encoded:", encoded)
print("Decoded:", decode_ascii85(encoded).decode())

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.