Base64: Alan kullanımında olabilecek en kötü artış nedir?


168

Bir sunucu base64 dizesi aldıysa ve dönüştürmeden önce uzunluğunu kontrol etmek istiyorsa, son bayt dizisinin her zaman 16KB olmasına izin vermek istediğini varsayalım. Bir Base64 dizesine dönüştürüldüğünde (karakter başına bir bayt olduğu varsayılarak) 16KB baytlık dizinin boyutu ne kadar büyük olabilir?

Yanıtlar:


245

Base64 her üç baytlık seti dört bayta kodlar. Buna ek olarak, çıktı her zaman dördün katı olacak şekilde doldurulur.

Bu, n boyutunda bir dizenin base-64 temsili boyutunun:

ceil(n / 3) * 4

Yani, 16kB'lık bir dizi için, base-64 temsili tavan (16 * 1024/3) * 4 = 21848 bayt uzunluğunda ~ = 21.8kB olacaktır.

Bir kaba yaklaşım veri boyutu orijinal 4/3 üzere arttırılır ve bu olacaktır.


Uzunluğa 2 eklememiz gerekiyor mu?
vIceBerg

@vIceBerg, O kullandığınız bağlıdır ceilile floatsayılar veya sadece intsayılar. (ve hayır ceil)
Bryan Field

7
Sanırım bunu koymanın daha basit yolu, orijinal boyutun 1 / 3'ünü eklemektir.
mvmn

1
Önerdiğiniz örnekte, sonucun aynı ölçü sırasına göre gösterilmesi yanıtın kalitesini biraz artıracaktır (21848 Bayt yerine 21,3 KB).
Ivan De Paz Centeno

36

Gönderen Wikipedia

N baytlık bir girdi verildiğinde, çıktının (n + 2 - ((n + 2)% 3)) / 3 * 4 bayt uzunluğunda olacağını, böylece girdi baytı başına çıktı bayt sayısının 4 / 3'e yakınlaşacağını unutmayın. veya büyük n için 1.33333

Böylece 16kb * 4/3, tam olarak 21.3 'kb veya 21848 bayttan az bir değer verir.

Bu yardımcı olur umarım


11

16kb, 131.072 bittir. Base64, 24 bitlik arabellekleri her birinde dört adet 6 bitlik karakter olarak paketler, böylece 5.462 * 4 = 21.848 baytınız olur.


5

Soru olası en kötü artışla ilgili olduğundan, her 80 karakterde genellikle satır sonları olduğunu eklemeliyim. Bu, base64 kodlanmış verileri Windows'ta bir metin dosyasına kaydediyorsanız, her satır için Linux 1 baytında 2 bayt ekleyeceği anlamına gelir.

Gerçek kodlamadan kaynaklanan artış yukarıda açıklanmıştır.


3
1 kaynak baytın 4 base64 bayt olması aşırı bir durum değil mi, yani 4 kat artış mı? Daha uzun kaynak materyaller, diğerlerinin söylediği gibi, asimptotik olarak 1.333'e yaklaşana kadar daha iyi bir oran kazanır ...
Olie

1

Bu kendim için gelecekteki bir referans. Soru en kötü durumda olduğu için satır sonlarını dikkate almalıyız. RFC 1421, maksimum satır uzunluğunu 64 karakter olarak tanımlarken, RFC 2045 (MIME) bir satırda en fazla 76 karakter olacağını belirtir.

İkincisi, C # kütüphanesinin uyguladığı şeydir. Satır sonu 2 karakter (\ r \ n) olan Windows ortamında şunu elde ederiz:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

Not: Döşeme, C # ile yaptığım test sırasında, son satır tam olarak 76 karakterle bitiyorsa, satır sonu gelmemesidir.

Aşağıdaki kodu çalıştırarak kanıtlayabilirsiniz:

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

76 karakterlik satırlarla base64'e kodlanmış 16 kByte için yanıt: 22422 karakter

Linux'ta olduğunu varsayın Length = Floor(Ceiling(N/3) * 4 * 77 / 76)ama henüz .NET çekirdeğimde test edemedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.