Sebagian bit karakter terakhir tidak membawa data
RFC 4648 §3.5 mewajibkan encoder yang sesuai mengisi bit padding dengan nol. Untuk satu byte input, hanya dua bit teratas karakter Base64 kedua membawa data; empat sisanya bit padding. g memiliki indeks 32, 100000; h memiliki indeks 33, 100001. Byte f adalah 01100110 dan bit datanya sama pada kedua representasi. Zg== merupakan keluaran kanonis; Zh== memiliki bit padding bukan nol. Karakter = di akhir berbeda dari bit yang dibuang.
Periksa dekode dan encoding ulang
Dekode Base64 toleran WHATWG Infra membuang empat bit terakhir dari kelompok tersisa 12 bit, atau dua dari kelompok 18 bit. HTML atob memakai algoritme ini. Moyoutil memulihkan byte dengan atob lalu membaca teks UTF-8. Contoh yang dijalankan menghasilkan f untuk Zg== dan Zh==, serta fo untuk Zm8= dan Zm9=. Encoding ulang menghasilkan Zg== dan Zm8=. Kode berikut mengodekan ulang byte langsung, tanpa mengubah biner sembarang menjadi teks UTF-8.
for (const input of ['Zg==', 'Zh==', 'Zm8=', 'Zm9=']) {
const bytes = atob(input);
const canonical = btoa(bytes);
console.log(input, bytes, canonical, input === canonical);
}
// Zg== f Zg== true
// Zh== f Zg== false
// Zm8= fo Zm8= true
// Zm9= fo Zm8= falseByte yang sama dan string asli yang sama adalah kondisi berbeda. Tentukan kesamaan yang diperlukan kunci cache atau perbandingan. Jika protokol penerima memerlukan input kanonis, validasi aturannya. Kami tidak menyarankan mengubah string bertanda tangan sebelum verifikasi. Perbandingan ini hanya untuk Base64 standar dengan padding, bukan validator semua protokol.
Pertanyaan yang Sering Diajukan
Apakah semua decoder menerima Zh==?
Tidak. RFC 4648 mengizinkan penolakan bit padding bukan nol; spesifikasi yang merujuknya dapat menentukan perilaku. Hasil ini menjelaskan HTML atob dan implementasi Moyoutil saat ini.