2010-12-01 2 views
5

가능한 중복 :
Why does base64 encoding requires padding if the input length is not divisible by 3?Base64 인코딩에서 패딩이 사용되는 이유는 무엇입니까?

Wikipedia를 인용은 : 디코딩 할 때

...이 패딩 문자는 다음 은 폐기해야하지만 여전히 는 계산을 허용 유효 인코딩되지 않은 텍스트의 길이, 해당 입력 이진 길이는 3 바이트의 배수가 아닙니다. ...

그러나 패딩 문자를 제거하더라도 길이 원시 데이터 계산은 쉽게 수행 할 수 있습니다.

  |    Encoded 
      |-------------------------------------- 
Raw Size | Total Size | Real Size | Padding Size 
1   | 4   | 2   | 2 
2   | 4   | 3   | 1 
3   | 4   | 4   | 0 
4   | 8   | 6   | 2 
5   | 8   | 7   | 1 
6   | 8   | 8   | 0 
7   | 12   | 10  | 2 
8   | 12   | 11  | 1 
9   | 12   | 12  | 0 
10  | 16   | 14  | 2 
. 
. 
. 

가 그래서 실제 인코딩 크기 (세 번째 열) 당신은 항상 올바르게 크기가 될 것 패딩 무엇인지 추측 할 수 주어진 :

PaddedSize = 4 * Ceil (RealSize/4) 

그래서 이론적으로, 패딩의 필요가 없었다. 알고리즘이 그것을 처리했을 것입니다. Base64 인코딩은 널리 사용되는 산업 표준으로, 많은 응용 프로그램 및 장치에서 사용됩니다. 이것들은 인코딩 된 크기의 감소로부터 이익을 얻었을 것입니다. 그렇다면 왜 Base64 인코딩에서 패딩이 사용되는 것입니까?

+0

@ 이그나시오 : 그 질문은 왜 * 왜 설명하는 것이 좋지 않습니다. – BastiBen

+0

일부 중복이 허용 된 것으로 생각됩니다 (http : //blog.stackoverflow.충분한 정보가 질문에 담겨 있고 다른 관점으로 질문을받는 한 com/2010/11/dr-strangedupe-or-how-i-learn-to-stop-worrying-and-love-duplication /) – Hemant

답변

4

인코딩 된 메시지를 4 자 이상의 정수 배로 만듭니다. 이렇게하면 디코더를 약간 더 쉽게 작성할 수 있습니다. 4 블록 단위로 문자를로드 및 처리하고 3 개의 출력 문자로 변환 할 수 있으며 패딩을 사용하면 문자열의 끝 부분을 벗어나지 않고 쉽게이 작업을 수행 할 수 있습니다.

+1

질문에서 언급했듯이 실제 인코딩 된 데이터의 크기만큼 패딩 문자의 수를 계산할 수 있습니다. 따라서 처리하기 전에 원하는 경우 추가 할 수 있습니다. 실제로 와이어를 통해 전송할 필요가 없습니다! – Hemant

+3

유선을 통해 전송하는 비용은 매우 적습니다 (메시지 당 최대 2 바이트). 디자이너는 인코딩 된 메시지를 가변 길이 블록이 아닌 4 바이트 블록 시퀀스로 만들어서 간단하게 만드는 것이 약간 더 효율적으로 만드는 것보다 더 중요하다고 생각했습니다. 대역폭에 관심이 있다면 어쨌든 base64를 사용하는 시스템을 설계하지 않을 것입니다. – Angus

+0

음 ... 단순함 부분에 동의하는 경향이 있습니다! 그저 방금 패딩의 기술적 인 필요성이 있다고 가정했는데 ... – Hemant

1

참고로 메시지의 길이에 관계없이 end-padding 길이는 최대 2 바이트이므로 미세 최적화와 같은 중요한 절약이 아닙니다. 응용 프로그램이 제작자이자 인코딩 사용자 인 경우 패딩을 제거 할 수는 있지만 혼전 할 가치는 없습니다.

+1

그것이 그 목적이라면, 그것을 확실하게 할 수있을 것이며 그렇게 할 수 없을 것입니다. – Angus

+2

그래, 3 분의 1의 경우 유효한 base64 인코딩 된 문자열이 패딩으로 끝나지 않습니다. – Hemant

+0

@ Angus, Hemant : 좋은 지적, 편집 됨. – Piskvor

0

Base64는 오래된 것으로, 사용 가능한 RAM 및 CPU에 한계가있는 날로부터 왔습니다. 또한 소프트웨어를 작성하는 것이 더 복잡했습니다. 오늘날의 SDK와 툴킷은 이며,은 80 년대 또는 90 년대보다 사용자 친화적이었으며 Base64는 다양한 시스템 아키텍처에서 실행되어야했습니다. 개발자는 Base64 데이터를 디코딩 한 후 "실제"데이터가 대략 n 바이트가 될 것이라고 추정 할 수 있습니다. 그 결과 더 나은 메모리 관리를 할 수있게되었습니다.

오늘은 더 이상 중요하지 않지만 리소스가 제한된 날에는 다시 좋은 소식이었습니다.

업데이트 : 나는 downvote를 5 년 후에 얻을 것이라고 생각하지 않았지만 지금은 내 대답으로 문제를 볼 수 있습니다. 나는 우리 모두가 나이를 먹은다고 생각합니다. ;) 방문객 여러분, 소금 한알로이 답변을 즐기십시오.

+0

'firstColumn = 3Column * 3/4' ('firstColumn'과'thirdColumn' 정수 변수를 가정 해 봅시다.) 간단한 정수 연산처럼 보입니다. 플랫폼에서 수행 할 수 있습니다. – Hemant

관련 문제