~이다. 표현 가능한 가장 높은 주소인 2128−1 = 74×8519 + 53×8518 + 5×8517 + ... 는 =r54lj&NUUO~Hi%c2ym0로 인코딩된다.[1]
이 문자 집합은 "',./:[\] 문자를 제외하므로 JSON 문자열에서 사용하기에 적합하다(여기서 " 및 \는 이스케이프가 필요함). 그러나 SGML 기반 프로토콜, 특히 XML의 경우 문자열 이스케이프가 여전히 필요할 수 있다(<, > 및 &를 수용하기 위해).[1]
3. 기본 원리
이진 데이터를 텍스트로 인코딩해야 하는 이유는, 사람이 읽을 수 있는 텍스트만 전송하도록 설계된 기존의 통신 프로토콜을 통해 임의의 이진 데이터를 통신해야 할 필요성이 있기 때문이다. 이러한 통신 프로토콜은 7비트만 사용하고, ASCII 제어 코드를 제외하면 95종류의 ASCII 인쇄 가능 문자만이 안전하게 통신에 사용될 수 있다.
4바이트(32비트)는 232 = 4,294,967,296 가지의 값을 표현할 수 있다. 85진법을 사용하면 5자리 숫자(855 = 4,437,053,125)로 이 값을 모두 표현할 수 있는데, 이는 84진법이 5자리로 표현할 수 있는 값(4,182,119,424)보다 크기 때문이다. 따라서 85는 4바이트를 5자리로 표현할 수 있는 최소값이 된다.
Ascii85 인코딩은 4바이트 데이터를 빅 엔디안 방식으로 묶어 32비트 정수로 해석하고, 이를 85진법으로 변환한다. 각 자리는 33을 더해 ASCII 인쇄 가능 문자 '!' (33)부터 'u' (117)까지의 문자로 표현된다. 모든 비트가 0인 블록은 "!!!!!" 대신 'z'로 압축된다.
복호화 과정에서 Ascii85로 표현된 "s8W-!"보다 큰 값은 오류로 처리되며, 'z' 문자가 블록 중간에 있는 경우도 오류이다. 공백 문자는 무시된다.
Ascii85는 백슬래시나 아포스트로피 같은 이스케이프 문자를 포함할 수 있어, 프로그래밍 언어나 통신 프로토콜에서 문제가 될 수 있다.[5] Z85와 같이 이러한 문제를 해결하기 위해 설계된 다른 인코딩 방식도 존재한다.
3. 1. 인코딩 과정
Ascii85 인코딩은 4바이트의 이진 데이터를 5개의 ASCII 문자로 변환하는 과정이다. 이 과정은 다음과 같이 진행된다.
1. 32비트 값 얻기: 4바이트 데이터를 빅 엔디안 방식으로 묶어 32비트 부호 없는 정수로 변환한다.
2. 85진법 변환: 32비트 값을 85진법으로 변환한다. 85로 반복해서 나누고 나머지를 취하는 방식이다.
3. ASCII 문자로 변환: 85진법으로 표현된 각 자리(0~84)에 33을 더하여 ASCII 인쇄 가능 문자 '!' (33)부터 'u' (117)까지의 문자로 변환한다.
4. 특수 처리 ('z'): 모든 비트가 0인 블록은 "!!!!!" 대신 'z' 문자 하나로 압축하여 표현한다.
예를 들어, "Man i"라는 문자열을 Ascii85로 변환하는 과정은 다음과 같다.
| 텍스트 내용 | M | a | n | | i |
|---|
| ASCII | 77 | 97 | 110 | 32 | 105 |
|---|
| 비트 패턴 | 0|1|0|0|1|1|0|1|0|1|1|0|0|0|0|1|0|1|1|0|1|1|1|0|0|0|1|0|0|0|0|0 | 0|1|1|0|1|0|0|1 |
|---|
| 32비트 값 | 1,298,230,816 = 24×854 + 73×853 + 80×852 + 78×85 + 61 | 1701604969 |
|---|
| 85진수 (+33) | 24 (57) | 73 (106) | 80 (113) | 78 (111) | 61 (94) | ... |
|---|
| ASCII | 9 | j | q | o | ^ | ... |
|---|
마지막 4바이트가 4바이트 미만일 경우 0으로 채운 후 인코딩을 수행하고, 인코딩된 결과에서 채워진 0의 개수만큼 문자를 제거한다.
복호화는 위 과정을 역순으로 수행한다. 단, 마지막 5문자는 'u'로 채워서 계산하고, 추가된 'u'의 개수만큼 출력 결과에서 마지막 바이트를 제거한다.
Ascii85 인코딩은 백슬래시나 아포스트로피와 같은 이스케이프 문자를 포함할 수 있다는 단점이 있다. 이러한 이스케이프 문자는 프로그래밍 언어나 통신 프로토콜에서 특별한 의미를 가지기 때문에 문제가 될 수 있다.[5]
3. 2. 디코딩 과정
디코딩 시에는 인코딩 과정의 반대가 적용된다. 마지막 블록은 Ascii85 문자 `u`로 5바이트까지 채워지고, 패딩으로 추가된 바이트 수만큼 출력의 끝에서 생략된다.
예를 들어, 인코딩된 텍스트의 마지막 부분은 다음과 같다.
```
...F*2M7/c~>
```
이것을 디코딩하는 과정은 다음과 같다.
1. 마지막 블록 채우기: 마지막 블록 `"/c"`는 2개의 문자만 가지고 있으므로, 5개의 문자가 되도록 `u` 3개를 추가하여 `"/cuuu"`로 만든다.
2. 베이스 85로 변환: 각 문자를 베이스 85 값으로 변환한다 (ASCII 값에서 33을 뺌).
3. 32비트 값 계산: 베이스 85 값들을 사용하여 32비트 정수 값을 계산한다.
4. 바이너리 변환: 32비트 정수 값을 바이너리 비트 패턴으로 변환한다.
5. ASCII 변환: 바이너리 비트 패턴을 8비트씩 묶어 ASCII 코드로 변환하고, 해당 ASCII 코드에 해당하는 문자를 얻는다.
6. 패딩 제거: 원래 인코딩 과정에서 3바이트가 추가되었으므로, 디코딩 결과의 마지막 3바이트를 제거한다.
이 과정을 표로 나타내면 다음과 같다.
| ASCII | / | c | u | u | u |
|---|
| 베이스 85 (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) |
|---|
| 32비트 값 | 771,955,124 = 14×854 + 66×853 + 84×852 + 84×85 + 84 |
|---|
| 비트 패턴 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
|---|
| ASCII | 46 | 3 | 25 | 180 |
|---|
| 텍스트 내용 | . | ETX | EM | ´ (확장 ASCII) |
|---|
패딩으로 추가되었던 3바이트 (''ETX'', ''EM'', ''´'')를 제거하면, 최종 디코딩 결과는 마침표('''.''')가 된다.
Ascii85로 인코딩된 블록에서는 5자 블록 중간을 포함하여 어디에서나 공백 및 줄 바꿈 문자가 있을 수 있지만, 디코딩 과정에서 자동으로 무시된다. Adobe의 사양은 `y` 예외를 지원하지 않는다.
4. 한계 및 문제점
Ascii85는 4바이트를 5개의 ASCII 문자로 표현하여 이진 데이터를 텍스트 형식으로 인코딩하는 방식이다. 이 방식은 95개의 인쇄 가능한 ASCII 문자만을 사용할 수 있는 환경에서 이진 데이터를 전송하기 위해 고안되었다. 85진법을 사용하면 5자리로 32비트 값을 충분히 표현할 수 있어 85가 기수로 선택되었다.
인코딩 과정에서 모든 데이터가 0인 경우는 예외적으로 "z" 한 문자로 압축한다. Ascii85는 백슬래시(\\)나 아포스트로피(')와 같은 이스케이프 문자를 포함할 수 있어, 일부 프로그래밍 언어나 프로토콜에서 문제를 일으킬 수 있다. 이러한 문자는 해당 환경에서 특별한 의미를 가지기 때문이다. 반면, Z85와 같은 다른 base-85 인코딩은 소스 코드에서도 안전하도록 설계되었다.[5]
4. 1. 호환성 문제
Ascii85 인코딩은 7비트 및 8비트 MIME와 호환되며, Base64보다 오버헤드가 적다.[2]
Ascii85의 잠재적인 호환성 문제 중 하나는 사용되는 일부 문자가 XML 또는 SGML과 같은 마크업 언어에서 중요한 의미를 갖는다는 것이다. 이러한 문서에 Ascii85 데이터를 포함하려면 따옴표, 꺾쇠 괄호, 앰퍼샌드를 이스케이프해야 할 수 있다.
5. 활용 예시
Ascii85는 주로 포스트스크립트와 PDF 파일 형식에서 사용된다.
5. 1. 인코딩 예시
Ascii85 인코딩은 4바이트의 데이터를 5개의 ASCII 문자로 표현하는 방식이다. 빅 엔디안 방식을 사용하여 32비트 이진수를 85로 반복적으로 나누어 나머지를 취하는 방식으로 5개의 기수-85 숫자로 변환한다. 각 숫자는 33을 더하여 ASCII 인쇄 가능 문자로 인코딩된다. (ASCII 문자 33(!)에서 117(u)까지).
데이터 압축을 위해 모두 0인 데이터 그룹은 `!!!!!` 대신 단일 문자 `z`로 인코딩하는 예외가 적용된다.
다음은 토마스 홉스의 저서 ''리바이어던''의 인용구를 Ascii85로 인코딩하는 예시이다.
'''인용구:'''
''인간은 이성뿐만 아니라 다른 동물들과는 다른 독특한 열정, 즉 마음의 욕망으로 구별된다. 이는 끊임없이 지식을 생성하는 기쁨을 통해 어떤 육체적인 쾌락보다 짧은 격정을 뛰어넘는다.''
'''Ascii85 인코딩 결과:'''
```text
9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKFCj@.4Gp$d7F!,L7@<6@)/0JDEF
DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKYi(
DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF-FD5W8ARlolDIal(
DIdu
D.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c
```
'''변환 과정:'''
| 텍스트 내용 | M | a | n | | ... | s | u | r | e |
|---|
| ASCII | 77 | 97 | 110 | 32 | ... | 115 | 117 | 114 | 101 |
|---|
| 비트 패턴 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
|---|
| 32비트 값 | 1,298,230,816 = 24×854 + 73×853 + 80×852 + 78×85 + 61 | ... | 1,937,076,837 = 37×854 + 9×853 + 17×852 + 44×85 + 22 |
|---|
| Base 85 (+33) | 24 (57) | 73 (106) | 80 (113) | 78 (111) | 61 (94) | ... | 37 (70) | 9 (42) | 17 (50) | 44 (77) | 22 (55) |
|---|
| ASCII | 9 | j | q | o | ^ | ... | F | * | 2 | M | 7 |
|---|
마지막 4바이트 튜플이 완전하지 않은 경우, 최대 3개의 0 바이트를 추가하여 채운다. 인코딩 후에는 추가된 0 바이트의 수만큼 출력에서 제거한다.
| 텍스트 내용 | . | \0 | \0 | \0 |
|---|
| ASCII | 46 | 0 | 0 | 0 |
|---|
| 비트 패턴 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|---|
| 32비트 값 | 771,751,936 = 14×854 + 66×853 + 56×852 + 74×85 + 46 |
|---|
| Base 85 (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) |
|---|
| ASCII | / | c | Y | k | O |
|---|
위 예시에서는 3바이트의 패딩이 추가되었으므로, 마지막 세 문자 'YkO'는 출력에서 생략된다.
디코딩은 인코딩의 역순으로 수행된다. 마지막 5튜플은 Ascii85 문자 `u`로 채워지고, 패딩으로 추가된 바이트 수만큼 출력의 끝에서 생략된다.
| ASCII | / | c | u | u | u |
|---|
| Base 85 (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) |
|---|
| 32비트 값 | 771,955,124 = 14×854 + 66×853 + 84×852 + 84×85 + 84 |
|---|
| 비트 패턴 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
|---|
| ASCII | 46 | 3 | 25 | 180 |
|---|
| 텍스트 내용 | . | ETX | EM | ´ (확장 ASCII) |
|---|
위 예시에서는 입력이 세 개의 'u' 바이트로 채워졌으므로, 출력의 마지막 세 바이트는 무시되고 원래 마침표로 끝나게 된다.
이 예시에서는 입력 문장에 4개의 연속된 0 바이트가 없으므로 'z' 약어는 사용되지 않았다.
5. 2. 디코딩 예시
Ascii85 디코딩은 인코딩 과정의 역순으로 진행된다. Adobe의 Ascii85는 인코딩된 문자열의 끝을 "~>" 구분자로 표시하고, 마지막 그룹의 길이를 나타내기 위해 잘라내기를 사용한다. 디코딩 시에는 마지막 블록에 Ascii85 문자 'u'를 최대 5바이트까지 채우고, 패딩으로 추가된 바이트 수만큼 출력의 끝에서 생략한다.[1]
토마스 홉스의 ''리바이어던'' 인용문을 예시로 디코딩 과정을 살펴보자.
```text
<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKFCj@.4Gp$d7F!,L7@<6@)/0JDEF
O@3BB/F*&OCAfu2/AKY
i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF-FD5W8ARlolDIa
l(DId
>uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c~>
```
위 텍스트는 "<~" 와 "~>" 로 둘러싸여 있으므로 Ascii85로 인코딩된 텍스트임을 알 수 있다.
인코딩된 텍스트를 디코딩하는 과정은 다음과 같다.[1]
| ASCII | 9 | j | q | o | ^ | ... | F | * | 2 | M | 7 |
|---|
| 베이스 85 (+33) | 24 (57) | 73 (106) | 80 (113) | 78 (111) | 61 (94) | ... | 37 (70) | 9 (42) | 17 (50) | 44 (77) | 22 (55) |
|---|
| 32비트 값 | 1,298,230,816 = 24×854 + 73×853 + 80×852 + 78×85 + 61 | ... | 1,937,076,837 = 37×854 + 9×853 + 17×852 + 44×85 + 22 |
|---|
| 비트 패턴 | 1|0|0|1|1|0|1|0|1|1|0|0|0|0|1|0|1|1|0|1|1|1|0|0|0|1|0|0|0|0|0|0 | ... | 1|1|1|0|0|1|1|0|1|1|1|0|1|0|1|0|1|1|1|0|0|1|0|0|1|1|0|0|1|0|1 |
|---|
| ASCII | 77 | 97 | 110 | 32 | ... | 115 | 117 | 114 | 101 |
|---|
| 텍스트 내용 | M | a | n | | ... | s | u | r | e |
|---|
마지막 블록은 5개의 Ascii85 문자 'u'로 채워 계산한다.[1]
| ASCII | / | c | u | u | u |
|---|
| 베이스 85 (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) |
|---|
| 32비트 값 | 771,955,124 = 14×854 + 66×853 + 84×852 + 84×85 + 84 |
|---|
| 비트 패턴 | 0|1|0|1|1|1|0|0|0|0|0|0|0|1|1|0|0|0|1|1|0|0|1|1|0|1|1|0|1|0|0 |
|---|
| ASCII | 46 | 3 | 25 | 180 |
|---|
| 텍스트 내용 | . | [ ETX ] | [ EM ] | ´ (확장 ASCII) |
|---|
입력의 마지막이 'u'로 채워졌기 때문에, 출력의 마지막 3바이트는 무시하고 원문의 마침표까지만 복호화 결과로 사용한다.
6. 다른 인코딩 방식과의 비교
이진-텍스트 인코딩은 사람이 읽을 수 있는(human-readable) 문자만을 전송할 수 있는 기존 통신 프로토콜 위에서 이진 데이터를 다루기 위해 필요했다. 이러한 환경에서 문자는 7비트만을 사용하고 그마저도 일부 제어 문자를 빼야 하므로 데이터 전송에 사용할 수 있는 문자는 95개뿐이다.
4바이트는 232 = 4,294,967,296가지의 값을 가지고, 5자리 85진수(:en:radix)는 855 = 4,437,053,125가지의 값이 가능하므로 이걸로 32비트 값을 충분히 표현할 수 있다. 5자리의 84진수는 845 = 4,182,119,424가지 값만을 가지기 때문에 85가 5자리로 4바이트를 표현해 낼 수 있는 최소값이라 이것이 선택되었다.
Ascii85의 한 가지 단점은 인코딩 데이터가 백슬래시나 아포스트로피 같은 이스케이프 문자를 포함할 수 있다는 것인데, 이것들은 많은 프로그래밍 언어나 일부 문자 기반의 프로토콜에서 특별한 의미를 가지므로 문제가 될 수 있다. Z85는 소스 코드에서도 안전하도록 설계된 것이다.[6]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com