跳到内容
🛠️ToolsShed

Base85 Encoder / Decoder

使用Base85 (ASCII85)和RFC 1924编码进行编码和解码。

关于 Base85

Base85 使用 85 个可打印的 ASCII 字符对二进制数据进行编码。ASCII85 用于 PDF 和 PostScript。RFC 1924 使用不同的字符集。

关于此工具

Base85 是一种二进制到文本的编码系统,它将原始数据转换为可读的 ASCII 文本,非常适合通过纯文本通道传输二进制信息。与将数据扩展 33% 的 Base64 相比,Base85 空间效率更高,仅向文件大小添加约 25% 的开销——在处理图像或文档附件等大型有效负载时是一个有意义的优势。

要使用此编码器,只需选择您的编码变体(ASCII85 是 PDF 和 PostScript 中使用的 Adobe 标准;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.