본문으로 건너뛰기
🛠️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.