웹에서 바이너리 데이터를 전송하는 데 base128 대신 base64 만 사용하는 이유는 무엇입니까? ASCII 문자 집합에는 이론적으로 기본 128을 나타낼 수있는 128 개의 문자가 있지만 대부분의 경우 base64 만 사용하고 base128은 사용하지 않습니다.
웹에서 바이너리 데이터를 전송하는 데 base128 대신 base64 만 사용하는 이유는 무엇입니까? ASCII 문자 집합에는 이론적으로 기본 128을 나타낼 수있는 128 개의 문자가 있지만 대부분의 경우 base64 만 사용하고 base128은 사용하지 않습니다.
답변:
문제는 ASCII 문자 집합의 최소 32 자 이상이 수신 단말기에서 해석 할 수있는 '제어 문자'라는 것입니다. 예를 들어, 수신 터미널을 울리는 BEL (종) 문자가 있습니다. SOT (전송 시작) 및 EOT (전송 종료) 문자는 이름이 의미하는 바를 정확히 수행합니다. 데이터 구조가 스트림으로 직렬화 / 평탄화되는 방식에서 특별한 의미를 가질 수 있는 CR 및 LF 문자를 잊지 마십시오 .
Adobe 는 ASCII 문자 집합에서 더 많은 문자를 사용하기 위해 Base85 인코딩 을 만들었지 만 AFAIK는 특허로 보호됩니다.
128 개 문자 중 일부는 인쇄 할 수 없기 때문입니다 (주로 코드 포인트 0x20 미만에있는 문자). 따라서 와이어를 통해 문자열로 안정적으로 전송할 수 없습니다. 또한 코드 포인트 128 이상으로 이동하면 시스템간에 사용되는 다른 인코딩으로 인해 인코딩 문제가 발생할 수 있습니다.
다른 답변에서 이미 언급했듯이 핵심은 문자 집합을 인쇄 가능한 것으로 줄이는 것입니다. 더 효율적인 인코딩 체계는 basE91입니다 . 더 큰 문자 집합을 사용하고 낮은 ASCII 범위의 제어 / 공백 문자를 여전히 사용하지 않기 때문입니다. 이 웹 페이지에는 바이너리 대 base64 대 basE91 인코딩 효율성 의 멋진 비교가 포함되어 있습니다 .
한 번 Java 구현을 정리했습니다. 사람들이 관심이 있다면 GitHub에 게시 할 수 있습니다.
업데이트 : 이제 GitHub에 있습니다 .
처음 32 개의 문자가 제어 문자라는 것은 128 문자를 얻기 위해 사용할 필요가 없기 때문에 전혀 관련성이 없습니다. 선택할 수있는 256 개의 문자가 있으며 처음 32 개만 제어 문자입니다. 그러면 192자가 남으므로 제어 문자를 사용하지 않고도 128자가 완전히 가능합니다.
그 이유는 다음과 같습니다. 동일하게 보이고 어디에 있든 복사하여 붙여 넣을 수있는 무언가 여야합니다. 따라서 포럼, 채팅, 이메일 등에 동일하게 표시 될 문자 여야합니다. 즉, 포럼 / 채팅 / 이메일 클라이언트가 일반적으로 서식 지정 또는 무시에 사용할 수있는 문자를 사용할 수 없습니다. 또한 글꼴, 언어 및 지역 설정에 관계없이 동일한 문자 여야합니다.
그것이 이유입니다!
Base64는 다양한 문제를 해결하기 때문에 일반적입니다 (생각할 수있는 거의 모든 곳에서 작동 함).
전송이 8 비트 클린 인지 아닌지 걱정할 필요가 없습니다.
인코딩의 모든 문자를 인쇄 할 수 있습니다. 당신 은 그들을 볼 수 있습니다. 당신은 할 수 복사 및 붙여 넣기 를. URL (특정 변형)에서 사용할 수 있습니다. 기타
고정 인코딩 크기. 당신은 알고 m
바이트로 인코딩 항상 할 수있는 n
바이트.
모두가 그것에 대해 들어 봤습니다-널리 지원되고 많은 라이브러리가 상호 운용하기 쉽습니다.
Base128에는 이러한 모든 이점이 없습니다.
8 비트 깨끗한 것처럼 보이지만 base64는 65 개의 기호를 사용합니다. 대역 외 문자가 없으면 고정 된 인코딩 크기의 이점을 누릴 수 없습니다. 대역 외 문자를 사용하는 경우 더 이상 8 비트를 깨끗하게 할 수 없습니다.
그래도 모두 부정적인 것은 아닙니다.
base128은 base64보다 인코딩 / 디코딩이 더 쉽습니다. 시프트와 마스크 만 사용하면됩니다. 임베디드 구현에 중요 할 수 있음
base128은 사용 가능한 비트를 더 많이 사용하여 base64보다 전송을 약간 더 효율적으로 사용합니다.
사람들 은 base128을 사용합니다-나는 지금 그것을 사용하고 있습니다. 그것은 흔하지 않습니다.
이사지가 맞아요. Base64는 텍스트 만 필요한 프로토콜을 사용하여 전송을 위해 이진 데이터를 인코딩하는 데 사용됩니다. 그것은에 맞아 위키 항목.
base128 PHP-Class를 확인하십시오. ISO 8859-1 문자 세트로 인코딩 및 디코딩.