Base64: Mức tăng tồi tệ nhất có thể có trong việc sử dụng không gian là gì?


166

Nếu một máy chủ nhận được chuỗi base64 và muốn kiểm tra độ dài của nó trước khi chuyển đổi ,, giả sử nó muốn luôn cho phép mảng byte cuối cùng là 16KB. Mảng byte 16KB có thể trở nên lớn đến mức nào khi được chuyển đổi thành chuỗi Base64 (giả sử một byte cho mỗi ký tự)?

Câu trả lời:


242

Base64 mã hóa mỗi bộ ba byte thành bốn byte. Ngoài ra, đầu ra được đệm để luôn là bội số của bốn.

Điều này có nghĩa là kích thước của biểu diễn cơ sở-64 của một chuỗi có kích thước n là:

ceil(n / 3) * 4

Vì vậy, đối với mảng 16kB, biểu diễn cơ sở-64 sẽ là ceil (16 * 1024/3) * 4 = 21848 byte dài ~ = 21.8kB.

Một xấp xỉ thô sẽ là kích thước của dữ liệu được tăng lên 4/3 so với ban đầu.


Chúng ta có cần thêm 2 vào chiều dài hay không?
vIceBerg

@vIceBerg, Nó phụ thuộc vào việc bạn đang sử dụng ceilvới floatsố hay chỉ là intsố. (và không ceil)
Bryan Field

7
Tôi đoán cách đơn giản hơn để đặt điều này là bạn thêm 1/3 kích thước ban đầu.
mvmn

1
Trong ví dụ bạn đề xuất, hiển thị kết quả theo cùng thứ tự đo sẽ tăng một chút chất lượng của câu trả lời (21,3 KB thay vì 21848 Byte).
Ivan De Paz Centeno

36

Từ Wikipedia

Lưu ý rằng với một đầu vào là n byte, đầu ra sẽ là (n + 2 - ((n + 2)% 3)) / 3 * 4 byte, để số byte đầu ra trên mỗi byte đầu vào hội tụ đến 3/4 hoặc 1.33333 cho n lớn.

Vì vậy, 16kb * 4/3 cung cấp rất ít trên 21,3 'kb, hoặc 21848 byte, chính xác.

Hi vọng điêu nay co ich


11

16kb là 131.072 bit. Base64 gói bộ đệm 24 bit thành bốn ký tự 6 bit, do đó bạn sẽ có 5.462 * 4 = 21.848 byte.


5

Vì câu hỏi là về mức tăng tồi tệ nhất có thể, tôi phải thêm rằng thường có các ngắt dòng ở khoảng 80 ký tự. Điều này có nghĩa là nếu bạn đang lưu dữ liệu được mã hóa base64 vào một tệp văn bản trên Windows, nó sẽ thêm 2 byte, trên Linux 1 byte cho mỗi dòng.

Sự gia tăng từ mã hóa thực tế đã được mô tả ở trên.


3
Không phải trường hợp cực đoan là 1 byte nguồn trở thành 4 byte cơ sở, vì vậy tăng gấp 4 lần? Bất kỳ tài liệu nguồn nào dài hơn cũng có tỷ lệ tốt hơn cho đến khi, như những người khác đã nói, nó tiếp cận một cách bất thường 1.333 ...
Olie

1

Đây là một tài liệu tham khảo trong tương lai cho bản thân tôi. Vì câu hỏi là trong trường hợp xấu nhất , chúng ta nên tính đến ngắt dòng. Trong khi RFC 1421 định nghĩa độ dài dòng tối đa là 64 char, RFC 2045 (MIME) nói rằng có tối đa 76 char trong một dòng.

Thứ hai là những gì thư viện C # đã thực hiện. Vì vậy, trong môi trường Windows có ngắt dòng là 2 ký tự (\ r \ n), chúng ta sẽ nhận được điều này:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

Lưu ý: Sàn là bởi vì trong quá trình thử nghiệm của tôi với C #, nếu dòng cuối cùng kết thúc ở đúng 76 ký tự, không có ngắt dòng tiếp theo.

Tôi có thể chứng minh điều đó bằng cách chạy đoạn mã sau:

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

Câu trả lời cho 16 kBytes được mã hóa thành base64 với 76 dòng char: 22422 chars

Giả sử trong Linux là như Length = Floor(Ceiling(N/3) * 4 * 77 / 76)vậy nhưng tôi chưa kịp thử nghiệm nó trên lõi .NET của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.