[base64] Base64 : 공간 사용량의 최악의 증가는 무엇입니까?

서버가 base64 문자열을 수신하여 변환하기 전에 길이를 확인하려면 항상 최종 바이트 배열을 16KB로 허용하고 싶다고 가정하십시오. Base64 문자열로 변환 할 때 16KB 바이트 배열이 얼마나 커질 수 있습니까 (문자 당 1 바이트 가정)?



답변

Base64는 3 바이트의 각 세트를 4 바이트로 인코딩합니다. 또한 출력은 항상 4의 배수로 채워집니다.

이는 n 크기의 문자열을 나타내는 base-64 표현의 크기는 다음과 같습니다.

ceil(n / 3) * 4

따라서 16kB 배열의 경우 base-64 표현은 ceil (16 * 1024 / 3) * 4 = 21848 바이트 길이 ~ = 21.8kB입니다.

거친 근사는 데이터의 크기가 원래의 4/3로 증가한다는 것이다.


답변

에서 위키 백과

n 바이트의 입력이 주어지면 출력은 (n + 2-((n + 2) % 3)) / 3 * 4 바이트가되어 입력 바이트 당 출력 바이트 수가 4/3으로 수렴합니다. 또는 큰 n의 경우 1.33333입니다.

따라서 16kb * 4/3는 정확히 21.3 ‘kb (21848 바이트)를 거의 넘지 않습니다.

도움이 되었기를 바랍니다


답변

16kb는 131,072 비트입니다. Base64는 24 비트 버퍼를 각각 4 개의 6 비트 문자로 묶으므로 5,462 * 4 = 21,848 바이트가됩니다.


답변

질문은 가능한 최악의 증가에 관한 것이기 때문에 보통 80 자마다 줄 바꿈이 있음을 추가해야합니다. 즉, base64로 인코딩 된 데이터를 Windows의 텍스트 파일로 저장하는 경우 Linux에서 각 줄에 대해 1 바이트 씩 2 바이트가 추가됩니다.

실제 인코딩으로부터의 증가는 위에서 설명되었다.


답변

이것은 나 자신에 대한 미래의 참조입니다. 질문은 최악의 경우이므로 줄 바꿈을 고려해야합니다. RFC 1421은 최대 행 길이를 64 자로 정의하지만 RFC 2045 (MIME)는 한 줄에 최대 76자가 있다고 말합니다.

후자는 C # 라이브러리가 구현 한 것입니다. 따라서 줄 바꿈이 2 자 (\ r \ n) 인 Windows 환경에서 다음을 얻습니다.Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

참고 : 마루는 C #으로 테스트하는 동안 마지막 줄이 정확히 76 자로 끝나면 줄 바꿈이 발생하지 않기 때문입니다.

다음 코드를 실행하여 증명할 수 있습니다.

byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);

76 문자 줄로 base64로 인코딩 된 16KB에 대한 답 : 22422 자

Linux에서는 가능하다고 가정 Length = Floor(Ceiling(N/3) * 4 * 77 / 76)하지만 .NET 코어에서 아직 테스트하지 않았습니다.


답변