Saltar al contenido
🛠️ToolsShed

Base85 Encoder / Decoder

Codifica y decodifica texto usando Base85 (ASCII85) y codificación RFC 1924.

Acerca de Base85

Base85 codifica datos binarios usando 85 caracteres ASCII imprimibles. ASCII85 se utiliza en PDF y PostScript. RFC 1924 utiliza un conjunto de caracteres diferente.

Acerca de esta herramienta

Base85 es un sistema de codificación binario-a-texto que convierte datos brutos en texto ASCII legible, siendo ideal para transmitir información binaria a través de canales solo de texto. A diferencia de Base64, que expande datos en un 33%, Base85 es mucho más eficiente en espacio, agregando solo alrededor del 25% al tamaño del archivo, una ventaja significativa al tratar con cargas grandes como imágenes o archivos adjuntos de documentos.

Para usar este codificador, simplemente elige tu variante de codificación (ASCII85 es el estándar Adobe utilizado en PDF y PostScript; RFC 1924 es una alternativa orientada a redes), luego selecciona modo de codificación o decodificación. Pega tu texto o datos codificados, haz clic en el botón, y el resultado aparece con una comparación de tamaño que muestra exactamente cuánto espacio consume la versión codificada.

Base85 brilla en contextos especializados donde importan tanto la eficiencia como la seguridad del texto: PDF que almacenan fuentes incrustadas, gráficos PostScript en flujos de trabajo de impresión, o protocolos de red que necesitan representaciones compactas de datos binarios. Aunque Base64 sigue siendo más universalmente compatible, Base85 es la opción estándar cuando necesitas minimizar el tamaño de salida sin sacrificar portabilidad.

Preguntas Frecuentes

Implementación de Código

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.