basE91로 텍스트나 바이너리 바이트를 변환합니다: 인쇄 가능 문자 2개당 입력 13비트로, 일상적인 인쇄 가능 인코딩 중 가장 조밀합니다 — Base64의 33%에 맞서 약 23%의 오버헤드.
텍스트는 UTF-8 바이트로 처리되며, 바이너리 데이터를 위해 16진 바이트 모드가 있습니다. 함께 보기: Base64 | Base32 / Base58 | Ascii85.
모든 처리는 브라우저에서 로컬로 이루어지며 데이터는 어떤 서버에도 업로드되지 않습니다.
작동 방식:입력은 바이트로 변환된 뒤 13비트 그룹으로 묶여 각각 두 문자가 되고, 짧은 형태가 모호해지는 곳에는 14비트 그룹 하나가 쓰입니다.
입력 형식:
작동 방식:공백은 무시되며, 각 문자는 페이지 아래에 인쇄된 알파벳에서 조회됩니다. 알 수 없는 문자는 위치와 함께 보고됩니다.
출력 형식:
입력
출력
입력창에서 Ctrl+Enter를 누르면 현재 모드가 실행됩니다.
인코딩 또는 디코딩을 선택하고 해당 버튼을 클릭하세요. 셀프테스트는 130회의 인코딩/디코딩 왕복을 실행하고 여기에 개수를 보고합니다.
알파벳, 전체 인쇄: Base91에는 표준화 단체가 없어 알파벳이 구현마다 다를 수 있습니다. 이 페이지는 참조 구현의 알파벳을 사용하며, 아래의 모든 값은 표에 나열된 정확히 91개 문자로 만들었습니다.
초록 칸은 HTML 텍스트나 URL 쿼리에 안전하게 놓일 수 있는 문자이고, 주황 칸은 이스케이프나 퍼센트 인코딩이 필요합니다(표 아래 참고).
초록 칸은 HTML 텍스트나 URL 쿼리에 안전하게 놓일 수 있는 문자이고, 주황 칸은 이스케이프하거나 퍼센트 인코딩해야 합니다(표 아래 참고).
같은 92바이트 입력에서 측정한 크기:문자열에서 여기서 측정한 문자 수. Base91이 이기는 이유는 912 = 8281이 8192 값(13비트)을 덮기 때문입니다.
Base91이란 무엇인가?
Base91은 임의의 바이트를 인쇄 가능 ASCII 문자만으로 쓰는 방법으로, Base64와 같은 일을 하지만 문자당 더 많은 비트를 담습니다. 입력을 6비트 그룹으로 잘라 그룹당 한 문자를 인쇄하는 대신, 비트를 모아 13비트 이상이 되면 그 13(또는 14)비트의 값을 함께 이름 붙이는 두 문자를 인쇄합니다.
91자 알파벳에서 두 문자는 91 × 91 = 8281개의 서로 다른 값을 이름 붙일 수 있고, 213 = 8192이므로 두 문자에는 항상 13비트가 들어갑니다 — 89개의 값이 남습니다. 그것이 트릭의 전부입니다. 문자 2개당 13비트는 문자당 6.5비트로, Base64의 6에 맞서며 33% 대신 약 23%의 오버헤드를 삽니다.
30초 버전:test는 fPNKd가 되고, Hello, World!는 >OwJh>}AQ;r@@Y?F가 됩니다. 디코딩은 정확한 역이며 같은 91문자 알파벳이 필요합니다 — 다른 알파벳은 같은 바이트에서 다른 출력을 냅니다.
13과 14비트는 어디서 오는가
91 × 91 = 8281개 값을 문자 한 쌍이 이름 붙일 수 있는데, 이는 213 = 8192보다 많고 214 = 16384보다 적습니다. 그래서 문자 한 쌍은 항상 13비트를, 때로는 14비트를 실을 수 있습니다. 인코더는 13비트를 먼저 시도합니다. 13비트 값이 88보다 크면 그 값을 두 문자로 인쇄하고, 그렇지 않으면 14번째 비트를 취해 결과인 14비트 값을 대신 인쇄합니다.
88이라는 경계는 자의적이지 않습니다. 두 문자가 이름 붙일 수 있는 최댓값은 90 + 91 × 90 = 8280이고, 8192 + 89 = 8281은 이미 그것을 넘습니다. 따라서 어떤 14비트 그룹도 89 이상의 하위 13비트 창을 가질 수 없어서, 디코더는 값 자체만 보고 두 경우를 구별할 수 있습니다:
디코더가 보는 것
소비한 비트
이유
value & 8191이 89~8191
13비트
89 이상의 값은 13비트 분기에서만 올 수 있습니다. 그렇게 높은 하위 13비트 창을 가진 14비트 그룹은 최소 8281이어야 하는데, 어떤 문자 쌍도 그것을 이름 붙일 수 없기 때문입니다.
value & 8191이 0~88
14비트
인코더는 13비트 읽기가 88 이하일 때만 14비트로 되돌아가므로, 이 분기는 그 폴백이고 다른 것이 아닙니다.
끝에 남는 것 — 1~13비트 — 은 한 문자로 인쇄되고, 남은 것이 실제로 7비트를 넘을 때는 두 번째 문자가 추가됩니다. 그래서 인코딩된 길이는 두 문자 단계로 자라며 때때로 홀수 개수로 끝납니다.
알파벳과 빠진 세 문자
인쇄 가능 ASCII는 !(0x21)부터 ~(0x7E)까지 94문자를 담습니다. Base91은 그중 91개를 쓰고, 빠진 세 개는 하이픈 -, 어포스트로피 ', 백슬래시 \입니다. 문자, 숫자, 거의 모든 문장부호가 위 표에 보이는 순서대로 알파벳에 정확히 한 번씩 들어 있고, 92~94번째 인쇄 가능 문자는 단순히 주소 지정이 불가능합니다.
알파벳이 고정 순서이므로 값의 문자는 공식이 아니라 조회입니다. 알파벳을 다르게 정렬한 두 구현은 둘 다 "Base91"이면서 서로의 출력을 읽지 못하며, 이것이 혼란스러운 결과의 가장 흔한 원인입니다. 이 페이지는 자신의 알파벳을 인쇄해 출력을 항상 그것으로 거슬러 올라갈 수 있게 합니다.
다른 인쇄 가능 인코딩 옆의 Base91
인코딩
문자당 비트
입력 대비 크기
참고
Base16 (hex)
4
200%
바이트당 두 문자, 그대로 읽을 수 있고 조회할 알파벳이 없습니다.
Base32
5
160%
대소문자 무관하고 받아쓰기에 안전하지만 그룹 중 가장 낭비가 큽니다.
Base58
~5.86
~137%
주소를 위해 만들어졌고 밀도를 위한 것이 아닙니다: 혼동하기 쉬운 문자를 피합니다.
Base64
6
133%
어디에나 있는 기본값: 바이트 3개마다 문자 4개, 마지막 문자가 쓰지 않는 비트 6개를 낭비합니다.
Ascii85 / Base85
6.4
125%
바이트 4개마다 문자 5개, 조회 표가 필요 없지만 85로 나눠야 합니다 — Ascii85 변환기 참고.
Base91
~6.5
~123%
가장 조밀합니다: 문자 2개마다 13비트, 대신 가끔 14비트 그룹이 나옵니다.
백분율은 각 인코딩의 점근적 비용을 반올림한 것이며, 실제 92바이트 입력에 대한 측정된 문자 수는 이 페이지 위쪽 표에 있습니다. Base91은 인쇄 가능 ASCII로 어떤 인코딩이든 할 수 있는 최선에 가깝습니다. 문자당 7비트는 128개의 서로 다른 문자를 쓴다는 뜻인데, 인쇄 가능 범위는 그것을 제공하지 못합니다.
Base91이 아닌 것
표준이 아닙니다. RFC가 없습니다. 참조 구현은 Joachim Henke의 basE91 0.6.0으로 BSD 3절 라이선스로 배포됩니다. "Base91"은 이것이 아닌 알파벳에도 사용됩니다.
암호화가 아닙니다. 모든 문자는 입력 비트의 직접적인 재조립이며, 알파벳을 가진 사람은 누구나 한 번에 되돌릴 수 있습니다.
URL 안전이 아닙니다. 알파벳에 #, %, &, /, ?, "가 있고 이들은 모두 URL에서 의미가 변하므로, Base91 출력은 쿼리 문자열에 들어가기 전에 퍼센트 인코딩해야 합니다.
HTML 안전이 아닙니다.<, >, &, "도 있으므로 마크업에 넣는 Base91 문자열은 HTML 엔티티 변환기로 이스케이프해야 합니다.
고정 길이가 아닙니다. 출력 길이는 바이트 수가 아니라 비트 패턴에 의존하므로, 같은 크기의 두 입력이 한 문자 차이로 인쇄될 수 있습니다.
실제로 걸리는 함정
이 페이지의 알파벳은 참조 것입니다. 다른 도구가 같은 입력에 다른 출력을 내면, 어느 쪽이 고장났다고 가정하기 전에 그 알파벳을 비교하세요. 91문자가 같은 순서로 나타나야 합니다.
잘못된 문자 하나가 꼬리 전체를 바꿀 수 있습니다. 그룹 경계는 앞의 값들이 결정하므로 문자열 초반의 편집은 이후 모든 것을 이동시키고, 꼬리는 마지막 그룹의 남은 비트만으로 디코딩됩니다.
홀수 출력 길이는 정상입니다. 문자열이 잘렸다는 뜻이 아닙니다. 마지막 그룹은 남은 값이 7비트 이하일 때 한 문자를 인쇄합니다.
공개된 예시에 입력하지 않은 줄바꿈이 있을 수 있습니다. 줄 끝을 추가하는 셸 명령이 유명한 Base91 값이 같은 텍스트보다 한 문자 긴 흔한 이유입니다. echo "Hello, World!"는 인코더에 14바이트를 넘기고 >OwJh>}AQ;r@@Y?FF를 인쇄하는 반면, 텍스트만의 13바이트는 >OwJh>}AQ;r@@Y?F를 인쇄합니다. 둘 다 옳습니다. 바이트 수가 다를 뿐이며, 출력 상자 아래의 개수가 어느 것인지 말해 줍니다.
바이너리 데이터를 텍스트로 디코딩하는 것은 작동하지 않습니다. 디코딩된 바이트가 유효한 UTF-8이 아니면 보여줄 의미 있는 텍스트가 없으며, 그것이 16진 출력 모드의 용도입니다.
빠른 답변
"왜 이 페이지가 한 문자 차이 나는 값을 보여주나요?"
거의 항상 다른 알파벳입니다. 두 번째로 흔한 원인은 13비트 분기만 쓰고 14비트 폴백을 절대 쓰지 않는 도구입니다. 그 변형은 코드가 작지만 여기서 쓰는 참조 알고리즘과 다른 출력을 냅니다.
바이트를 세어 해결할 수 있는 정확한 사례도 하나 있으며, 가장 널리 인용되는 예시를 설명합니다: 끝의 줄바꿈입니다. 대부분의 공개 벡터는 셸 명령으로 생성되었고, 셸은 줄을 끝내는 줄바꿈을 추가합니다. Hello, World!의 13바이트는 여기서 16문자를 인쇄하는 반면, 줄바꿈이 뒤따르는 Hello, World! 14바이트는 17문자 >OwJh>}AQ;r@@Y?FF를 인쇄합니다. 둘 중 어느 값이든 디코딩에 붙여넣어 보세요: 이 페이지는 바이트 수를 보고하므로 두 독해는 논쟁 대신 구별할 수 있습니다. 샘플 버튼은 사용 중인 리더에 맞는 쪽을 불러오며, 인코딩/디코딩 스위치와 입력 형식 / 출력 형식 선택기를 따릅니다: 텍스트 리더는 16문자 값을, 16진 리더는 끝의 0A 바이트가 보이는 17문자 값을 받고, 인코더는 Base91 문자열이 아니라 인코딩할 텍스트를 받습니다.
"Base91이 Base64보다 작은가요?"
네, 인코딩된 크기의 약 8%입니다. 문자 2개당 13비트 대 문자당 6비트. 92바이트 텍스트에서 Base64는 124문자를, Base91은 114문자를 인쇄합니다.
"Base64 디코더로 디코딩할 수 있나요, 아니면 그 반대도요?"
아니요. 알파벳이 문자와 숫자에서 겹치므로 Base64 디코더는 Base91 문자열을 "유효한" 문자로 받아들여 조용한 쓰레기를 만듭니다. 둘은 방식의 뼈대 외에는 아무것도 동의하지 않습니다.
"출력이 Base64처럼 패딩으로 끝나나요?"
아니요. Base91에는 패딩 문자가 전혀 없습니다. 끝의 남은 비트는 마지막 그룹으로 인쇄되므로 덧붙이거나 떼는 것이 없습니다.
"이 페이지의 결과가 옳다는 것을 어떻게 알 수 있나요?"
셀프테스트 0~64바이트를 누르세요. 13과 14비트 분기가 바뀌는 모든 길이를 덮는 130개 바이트 패턴을 인코딩·디코딩하고, 돌아온 바이트를 들어간 바이트와 비교합니다. 샘플 버튼의 벡터는 이 사이트의 테스트 도구를 위해 작성된 두 번째 구현과도 교차 검증되어 있습니다.
표준과 크레딧
이 페이지는 Joachim Henke의 basE91 참조 구현(버전 0.6.0, BSD 3절 라이선스)의 알고리즘을 위에 인쇄된 알파벳과 함께 구현합니다. 디코딩은 참조 도구처럼 공백을 받아들여 무시합니다.
페이지 텍스트는 이 사이트를 위해 작성되었습니다. 알고리즘은 복사한 것이 아니라 위에 명시된 참조 구현을 따릅니다.