Bahasa Melayu

Alat pembangun · Pengekod & penyahkod Base64

Berapa besarkah Base64 membuat data anda? Overhed 4/3 telah berjaya

· Bagaimana ia berfungsi

asas64 pengekodan prestasi

Carta menunjukkan Base64 1.33x saiz input overhed
Ilustrasi vektor ToolAcre asal

Output Base64 adalah kira-kira satu pertiga lebih besar daripada inputnya, ditambah dengan padding dan mungkin pemisah baris. Catatan ini memperoleh formula yang tepat dan menggunakannya pada saiz yang realistik supaya anda boleh menilai kosnya.

Ikon 30 KB yang menjadi 40 KB dalam fail — lonjakan saiz konkrit yang mengejutkan semakan binaan

Ikon 30 KB yang diselaraskan sebagai Base64 dalam fail CSS menjadi 40 KB dan soalan semakan binaan timbul: dari mana datangnya 10 KB tambahan? Faktor pengembangan untuk Base64 sentiasa 4/3: setiap tiga bait input menghasilkan empat bait output (empat aksara). Untuk input 30 KB (30,000 bytes), bahagikan dengan tiga untuk mendapatkan kumpulan 10,000, darab dengan empat untuk mendapatkan output 40,000 bytes.

Matematik adalah deterministik dan tidak dapat dielakkan: Base64 bukan format mampatan. Jika aset sebaris menelan kos 33% lebih lebar jalur dan halaman dimuatkan dengan lebih cepat kerana satu permintaan HTTP yang lebih sedikit, itu wajar diukur. Jika kos 33% lebih tinggi dan dimuatkan dengan lebih perlahan, inlining tidak berbaloi. Nisbah 4/3 berasal daripada reka letak bit. Tiga bait ialah 24 bits; empat aksara Base64 membawa 24 bits (setiap satu membawa enam bit).

Mengapa 4/3 ialah lantai — enam bit setiap aksara berbanding lapan setiap bait, dan dari mana overhed yang tinggal berasal

Setakat ini, nisbah ialah 1:1. Tetapi aksara Base64 ialah teks (ASCII 0–127), dan purata ASCII aksara dalam pengekodan UTF-8 atau Latin-1 ialah satu bait. Jadi empat aksara Base64 ialah empat bait output untuk tiga bait input, nisbah 4/3. Ini tidak universal: jika Base64 adalah output sebagai format binari (satu bait setiap aksara, dibungkus ke dalam enam bit), nisbah akan menjadi 3/4 (mampatan_TA_PROTECTED_11__).

Oleh kerana Base64 direka bentuk untuk pengangkutan teks, ia menggunakan aksara teks dan kos ialah 33% peningkatan saiz. Padding menambah margin kecil pada hujungnya. Jika panjang input berbilang tiga, tiada padding diperlukan. Jika panjang input 1 mod 3 (kurang satu bait daripada berbilang), dua aksara padding = ditambah, meningkatkan output sebanyak 2. Jika 2 mod 3, satu aksara padding = ditambah, meningkat sebanyak 1.

Formula tepat dengan pelapik — ceil(n/3) × 4 aksara dan kesan untuk input 1, 2 dan 3 bytes

Untuk input yang besar, margin boleh diabaikan: 300-bait input memerlukan 400 aksara ditambah paling banyak dua aksara padding, perbezaan kurang daripada 0.5%. Untuk input kecil (1–3 bytes), pelapik mendominasi: satu bait menghasilkan YQ== (empat aksara), pengembangan 4x. Tetapi purata merentas fail dikuasai oleh yang besar. Formula tepat ialah ceil(n / 3) × 4 aksara, dengan n ialah kiraan bait input.

Untuk n = 1, siling(1/3) × 4 = 1 × 4 = 4. Untuk n = 2, siling(2/3) × 4 = 1 × 4 = 4. Untuk n = 3, siling(3/3) × 4 = 1 × 4 = 4. Untuk n = 4, siling(4/3) × 4 = 2 × 4 = 8. Untuk n = 30000, siling(30000/3) × 4 = 10000 × 4 = 40000. Kes input kecil menjelaskan mengapa "kira-kira satu pertiga" tidak tepat untuk setiap nilai. Satu bait masih menduduki blok empat aksara, begitu juga dengan dua bait. Nisbah menghampiri empat pertiga sahaja kerana banyak kumpulan tiga bait lengkap menguasai blok empuk terakhir.

Contoh yang berfungsi: mengukur rentetan 20-aksara UTF-8 — mengira bait daripada aksara, kemudian panjang Base64

Fungsi siling mengambil kira kumpulan terakhir yang bukan gandaan lengkap tiga. Apabila n semakin besar, siling(n/3) menghampiri n/3, jadi output menghampiri (n/3) × 4 = 4n/3, nisbah 4/3.

Ukur rentetan konkrit: 20 aksara bercampur ASCII, aksen dan emoji. Kiraan aksara ialah 15 dalam JavaScript (emoji mengira satu). UTF-8 kiraan bait berbeza: ASCII huruf 1 byte setiap satu, huruf beraksen 2 bytes (0xC3 0xA9 untuk é), emoji 4 bytes (0xF0 0x9F 0x08). Alat ini melaporkan UTF-16 aksara, titik kod Unicode dan UTF-8 bait secara berasingan. Perbezaan itu menghalang ayat dua puluh aksara yang mengandungi simbol berbilangbait daripada berharga sebagai dua puluh bait. Panjang yang dikodkan mengikut kiraan bait, bukan kiraan manusia pada skrin.

Pemutusan baris dan MIME pembalut — bagaimana pemformatan 76-lajur menambah beberapa peratus lagi

Jumlah sekitar 18 bytes. Base64 mengekod ini: ceil(18/3) × 4 = 6 × 4 = 24 watak. Sejak 18 gandaan tiga, tiada padding diperlukan. Output Base64 ialah 24 watak. Pengekodan menambah 24 - 18 = 6 bytes, atau 33%, mengesahkan 4/3 formula. MIME Pembalut Base64 memperkenalkan overhed tambahan. Klasik MIME membungkus di 76 aksara setiap baris dan menambah baris baharu.

Output Base64 400-aksara menjadi lebih kurang 405 bytes dengan baris baharu dimasukkan. Untuk setiap 76 aksara keluaran Base64, satu bait baris baharu dimasukkan. Untuk fail besar, tambah kurang daripada 2%. Untuk lampiran e-mel, konvensyen baris baharu adalah standard dan dijangka oleh penghurai; alat menerima Base64 yang dibalut dan menyahkod dengan betul. Interaksi mampatan merumitkan analisis saiz. Data binari mentah (imej, video) dimampatkan secara berbeza daripada teks Base64. ToolAcre memasukkan baris baharu selepas setiap hirisan aksara 76 dikonfigurasikan dan mengecualikan baris baharu tersebut daripada saiz aksara berkod yang dipaparkan. Belanjawan format wayar mesti menambah pemisah kembali; perbandingan saiz yang boleh dilihat sahaja menerangkan simbol Base64, bukan setiap bait penghujung baris yang dihantar.

Interaksi pemampatan — mengapa teks Base64 cenderung untuk dimampatkan lebih teruk daripada bait mentah yang diwakilinya

Rentetan Base64 mungkin memampatkan kepada 60% saiznya dengan gzip dan imej mungkin memampatkan kepada 25%. Oleh kerana gzip mencari corak bait berulang, perwakilan teks (huruf A–Z tambah + / atau - _) mempunyai kurang pengulangan daripada yang diwakili oleh data binari. Memasukkan imej dengan pemampatan selalunya lebih mahal dalam kod daripada membenamkan secara berasingan. Untuk fon, terutamanya kompleks dengan banyak glyph, inlining Base64 boleh menjadi tidak cekap.

Analisis tukar ganti bergantung pada konteks tertentu. Sebaris data kecil URI (10–50 bytes) mungkin bernilai overhed untuk mengelakkan permintaan HTTP. Memasukkan aset besar (100 KB) mungkin tidak. Mampatan bergantung pada corak dalam kedua-dua sumber dan perwakilan Base64, jadi peratusan overhed termampat universal adalah tidak jujur. Ukur aset sebenar sebelum dan selepas pemampatan tindak balas sekeliling. Kos tertentu ialah kiraan aksara tidak termampat yang diberikan oleh formula blok.

Perkara ini tidak meliputi — mengukur prestasi pemaparan atau penyahkodan dan pengoptimuman khusus format seperti WebP

Jika aset pada CDN dekat dengan pengguna, mengelakkan permintaan tidak mendapat manfaat. Jika aset pada pelayan yang sama dan pemuatan memerlukan perjalanan pergi-balik tambahan, inlining mungkin wajar. Pengukuran adalah penting: gunakan formula untuk mengira saiz sebaris, tambahkan kiraan aksara pada fail CSS atau HTML, ukur jumlah saiz fail dan masa muat.

33% overhed adalah pasti; faedah prestasi tidak. URL-selamat Base64 (base64url) mempunyai nisbah 4/3 yang sama, cuma aksara yang berbeza. Mengalih keluar padding menjimatkan dua aksara dalam kes terburuk. Untuk fail besar, boleh diabaikan. Untuk token JWT (tiga segmen base64url bercantum titik), mengalih keluar padding adalah konvensional tetapi menjimatkan ruang yang sangat sedikit; saiz sebenar ialah kandungan token, bukan pengekodan overhed. Kelajuan pemaparan, penyahkodan imej dan format alternatif seperti WebP memerlukan saiz yang berbeza. Rentetan Base64 yang lebih pendek tidak membayangkan lukisan yang lebih pantas, dan alat teks sahaja ini tidak menerima fail imej. Sumbangannya yang boleh dipercayai ialah aritmetik untuk teks UTF-8 yang dimasukkan dalam panel.

Bawa pulang: belanjakan satu pertiga tambahan — cara pengekod & penyahkod Base64 memberikan anda panjang sebenar yang dikodkan bagi sebarang teks supaya anda boleh mengukur dan bukannya meneka

Mampatan juga mengekod teks secara serupa; sama ada dua aksara terakhir == atau rentetan lebih pendek membuat hampir tiada perbezaan dalam output gzip. Pengekod & penyahkod Base64 melaporkan kedua-dua kiraan bait input dan kiraan aksara output serta-merta. Untuk sebarang pengekodan teks, boleh melihat peningkatan saiz yang tepat. Untuk rentetan UTF-8 dengan aksara berbilang bait, alat menunjukkan bahawa kiraan aksara (apa yang dilihat) berbeza daripada kiraan bait (apa yang dikodkan oleh Base64).

Rentetan aksara 10 mungkin 15 bytes jika mengandungi aksen dan emoji, menghasilkan 20 aksara keluaran Base64 dan bukannya nisbah 4/3 berdasarkan kiraan aksara. Memahami perbezaan menjelaskan sebab menyelaraskan ikon berat emoji lebih mahal daripada seni ASCII: bukan emoji berharga lebih tinggi, UTF-8 bait yang diwakilinya. Untuk nilai sebaris calon, rekodkan kiraan UTF-8-bait alat dan kiraan aksara berkod sebelah menyebelah. Kemudian masukkan awalan URI, sintaks CSS dan sebarang pembalut yang diperlukan oleh destinasi. Pengukuran lengkap itu lebih berguna daripada mengulang peratusan bulat tanpa kos pembingkaiannya.