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.