コンテンツへスキップ
🛠️ToolsShed

Base85 Encoder / Decoder

Base85(ASCII85)およびRFC 1924エンコーディングを使用してテキストをエンコードおよびデコードします。

Base85 について

Base85 は 85 個の印字可能な ASCII 文字を使用してバイナリデータをエンコードします。ASCII85 は PDF と PostScript で使用されます。RFC 1924 は異なる文字セットを使用します。

このツールについて

Base85は、生データを読み取り可能なASCIIテキストに変換するバイナリ-テキスト符号化システムです。テキストのみのチャネルを通じてバイナリ情報を送信する際に理想的です。Base64がデータを33%拡張するのに対し、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.