Ascii85를 인코딩하고 디코딩하는 방법
- 입력 · 텍스트에 텍스트를 입력하거나 붙여넣으세요. 출력 · Ascii85 (Adobe) 칸에 Ascii85가 나타납니다.
- 출력 아래에서 PostScript/PDF 형식의 틀이 필요하면 <~ ~> 구분자 추가를 체크하고, 디코더가 단축 표기를 지원하지 않으면 0 그룹을 z로 체크를 해제하세요.
- 다른 Base85 알파벳을 쓰려면 변환 후를 Base85 (Git / Python b85), Z85 (ZeroMQ), RFC 1924 (IPv6 Base85) 중 하나로 바꾸세요.
- 디코딩하려면 방향 전환에서 Ascii85 (Adobe) → 텍스트를 누르세요. 디코더는
<~ ~>구분자,z,y, 모든 공백 문자를 받으므로 파일에서 줄 바꿈된 데이터를 그대로 붙여넣을 수 있습니다. - 결과가 바이너리라면 변환 후를 Hex로 설정하거나 바이트 저장을 누르세요.
Ascii85의 작동 원리
Ascii85는 4바이트씩 가져와 하나의 32비트 빅 엔디언 숫자로 읽은 뒤 85진수 다섯 자리로 씁니다. 각 자리는 !(값 0)부터 u(값 84)까지의 문자입니다. 4바이트에 5문자이므로 오버헤드는 25%이고, Base64는 33%입니다.
대표적인 예는 끝에 공백이 붙은 Man 입니다. 바이트 4d 61 6e 20은 9jqo^가 됩니다. 마지막 그룹이 짧으면 인코더는 0 바이트로 채운 뒤 n바이트에 대해 n + 1자만 씁니다. 그래서 Hello(5바이트)는 87cURDZ가 됩니다. Hell에 다섯 문자, o에 두 문자입니다.
자주 나오는 패턴은 두 가지 단축 표기로 줄입니다. z는 0 바이트 네 개로 된 그룹, 풀어 쓰면 !!!!!를 대신합니다. y는 btoa 변형에서 공백 네 개를 대신합니다. 이 디코더는 둘 다 읽으며, 인코더는 z를 쓰고(끌 수 있음) y는 쓰지 않습니다.
Base85 변형 비교
| 변형 | 알파벳 | Hello | 사용처 |
|---|---|---|---|
| Ascii85 (Adobe) | ASCII 순서의 !부터 u까지 | 87cURDZ | PostScript, PDF /ASCII85Decode |
| Base85 (Git / Python) | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ | NM&qnZv | Git 바이너리 패치, Python base64.b85encode |
| Z85 | 0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$# | nm=QNzV | ZeroMQ와 CurveZMQ 키, Z85 참고 |
| RFC 1924 | Git과 같음 | IPv6 주소 하나가 4)+k&C#VzJ4br>0wv%Yp | IPv6 주소, 농담으로 |
Git과 RFC 1924의 알파벳은 같지만, RFC 1924는 16바이트 주소 전체를 4바이트 그룹 네 개가 아니라 하나의 128비트 숫자로 다룹니다. RFC 1924는 1996년 4월 1일에 발표되었으며 1080::8:800:200c:417a를 4)+k&C#VzJ4br>0wv%Yp로 쓰자고 제안합니다. 변환기에서 변환 전을 IPv6 주소로, 변환 후를 RFC 1924 (IPv6 Base85) 형식으로 설정하면 이 결과가 재현됩니다.
PDF와 PostScript의 Ascii85
PostScript Level 2는 이미지나 글꼴 같은 바이너리 데이터를 텍스트 파일에 넣으려고 Ascii85를 도입했습니다. 데이터는 <~ … ~>로 감쌉니다. PDF에서는 /Filter /ASCII85Decode가 붙은 스트림이 같은 인코딩을 담고 있으며 ~>로 끝납니다. 이 디코더는 여는 <~가 있든 없든 끝 표시를 찾아냅니다.
Ascii85는 /Filter [/ASCII85Decode /FlateDecode]처럼 필터 체인의 바깥쪽에 오는 경우가 많습니다. 이때 Ascii85를 디코딩하면 읽을 수 있는 내용이 아니라 zlib으로 압축된 바이트가 나옵니다.
Git은 Base85를 다르게 씁니다. GIT binary patch에서 각 줄은 길이를 나타내는 문자 하나(1–26바이트는 A–Z, 27–52바이트는 a–z)로 시작하고, 그 뒤에 zlib으로 압축한 데이터의 Base85가 옵니다. 디코딩하기 전에 각 줄의 첫 문자를 지우고, 결과의 압축을 푸세요.
Python에서 Ascii85와 Base85
표준 라이브러리에 두 알파벳이 모두 있습니다.
import base64
base64.a85encode(b"Hello") # b'87cURDZ'
base64.a85encode(b"Hello", adobe=True) # b'<~87cURDZ~>'
base64.a85encode(b" ", foldspaces=True) # b'y'
base64.b85encode(b"Hello") # b'NM&qnZv'
base64.a85decode(b"<~9jqo^~>", adobe=True) # b'Man '
a85decode가 구분자를 받으려면 adobe=True가 필요합니다. 더 많은 인코딩 예시는 Python 페이지에 있습니다.
자주 생기는 문제
… 위치의 "z"은(는) 5자 그룹 사이에서만 허용됩니다. 그룹 안에z가 있습니다. 데이터가 손상되었거나 Ascii85가 아닙니다. Z85와 Git의 Base85는z를 일반 숫자로 씁니다.… 위치에서 시작하는 그룹이 범위를 벗어났습니다. 다섯 문자가 2^32 − 1보다 큰 값을 인코딩하고 있습니다. Git Base85나 Z85를 Ascii85로 디코딩할 때 생기므로 변환 전을 바꾸세요.v,{,|같은 예상하지 못한 문자.y와z단축 표기를 제외하면u뒤의 문자는 모두 Ascii85 알파벳 밖에 있습니다. 이것도 다른 변형이라는 신호입니다.- 출력 끝에 0 바이트가 더 붙음. 인코더가 마지막 그룹을 채운 뒤 5문자를 모두 썼기 때문입니다. Ascii85는 n바이트짜리 마지막 그룹에 n + 1자를 씁니다.
자주 묻는 질문
Base85와 Ascii85는 어떻게 다른가요?
Base85는 4바이트를 85개 문자 집합에서 고른 5문자로 쓰는 방식 전반을 가리킵니다. Ascii85는 Adobe의 버전으로, !부터 u까지의 문자, z 단축 표기, <~ ~> 구분자를 씁니다. Git, Python의 b85encode, Z85, RFC 1924는 같은 계산 방식에 다른 알파벳을 씁니다.
Ascii85에서 z는 무슨 뜻인가요?
z 하나는 0 바이트 네 개를 나타내며, 그렇지 않으면 !!!!!로 써야 합니다. 5문자 그룹이 시작될 자리에서만 허용되고, 그룹 안에 있는 z는 오류입니다.
PDF의 Ascii85는 어떻게 디코딩하나요?
stream과 endstream 사이의 스트림 데이터를 ~>까지 포함해 복사하고, 방향을 Ascii85 (Adobe) → 텍스트로 설정해 붙여넣으세요. 스트림에 /FlateDecode도 지정되어 있다면 결과는 zlib 데이터입니다. 변환 후를 Base64로 설정하고 gzip, zlib 디코더로 압축을 푸세요.
Base85가 Base64보다 나은가요?
약 6% 짧습니다. 오버헤드가 33%가 아니라 25%입니다. 하지만 변형에 따라 알파벳에 따옴표, 백슬래시, <, &가 들어 있어서 Base64라면 필요 없는 이스케이프를 JSON, XML, 셸에서 해야 합니다. 이런 문자가 안전한 곳에서 쓰세요.