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


168

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

답변:


245

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

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

ceil(n / 3) * 4

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

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


길이에 2를 더해야합니까?
vIceBerg 5

@vIceBerg, 숫자 ceil와 함께 사용하는지 아니면 float숫자 만 사용하는지에 따라 다릅니다 int. (및 아니오 ceil)
Bryan Field

7
이것을 넣는 가장 간단한 방법은 원래 크기의 1/3을 추가하는 것입니다.
mvmn

1
제안한 예에서 결과를 동일한 측정 순서로 표시하면 응답 품질이 약간 높아집니다 (21848 바이트 대신 21,3KB).
Ivan De Paz Centeno

36

에서 위키 백과

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

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

도움이 되었기를 바랍니다


11

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


5

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

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


3
1 소스 바이트가 4 base64 바이트가되는 극단적 인 경우가 아니므로 4 배 증가합니까? 다른 사람들이 말했듯이, 더 이상 소스 자료가 무의식적으로 1.333에 접근 할 때까지 더 좋은 비율을 얻습니다 ...
Olie

1

이것은 나 자신에 대한 미래의 참조입니다. 질문은 최악의 경우이므로 줄 바꿈을 고려해야합니다. 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 코어에서 아직 테스트하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.