Перейти к содержимому

Base85 Encoder / Decoder

Кодируйте и декодируйте текст, используя Base85 (ASCII85) и кодирование RFC 1924.

О Base85

Base85 кодирует бинарные данные, используя 85 печатаемых символов ASCII. ASCII85 используется в PDF и PostScript. RFC 1924 использует другой набор символов.

Об этом инструменте

Base85 — это система кодирования бинарных данных в текст, преобразующая сырые данные в читаемый ASCII-текст. Она идеально подходит для передачи бинарной информации через текстовые каналы. В отличие от Base64, который расширяет данные на 33%, Base85 намного более эффективен по размеру: добавляет всего около 25% к объёму файла — существенное преимущество при работе с большими файлами, изображениями или документами.

Чтобы использовать этот кодировщик, просто выберите вариант кодирования (ASCII85 — стандарт Adobe для PDF и PostScript; RFC 1924 — альтернатива для сетевых протоколов), а затем режим кодирования или декодирования. Вставьте текст или закодированные данные, нажмите кнопку, и результат отобразится с указанием того, какой объём займет закодированная версия.

Base85 особенно полезен в специализированных областях, где важны одновременно эффективность и безопасность текста: встраивание шрифтов в PDF, PostScript-графика в рабочих процессах печати, или сетевые протоколы, требующие компактного представления бинарных данных. Хотя Base64 поддерживается более универсально, Base85 — стандартный выбор, когда нужно минимизировать размер выходных данных, сохраняя переносимость.

Часто задаваемые вопросы

Реализация кода

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.