Certains bits du dernier caractère ne portent aucune donnée
RFC 4648 §3.5 impose aux encodeurs conformes des bits de remplissage à zéro. Pour un octet d’entrée, seuls les deux bits supérieurs du deuxième caractère Base64 portent des données ; les quatre autres sont du remplissage. g a l’indice 32, 100000 ; h l’indice 33, 100001. L’octet de f est 01100110, et les bits de données coïncident. Zg== est canonique ; Zh== contient des bits de remplissage non nuls. Les caractères = finaux sont distincts des bits supprimés.
Vérifier le décodage et le réencodage
Le décodage tolérant de WHATWG Infra supprime quatre bits finaux d’un groupe restant de 12 bits, ou deux d’un groupe de 18. HTML atob utilise cet algorithme. Moyoutil restitue les octets avec atob puis les interprète comme texte UTF-8. Dans les exemples exécutés, Zg== et Zh== donnent f ; Zm8= et Zm9= donnent fo. Le réencodage produit Zg== et Zm8=. Le code ci-dessous réencode directement les octets, sans convertir des données binaires arbitraires en texte 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= falseDes octets égaux et des chaînes originales égales sont deux conditions différentes. Définissez l’égalité requise pour la clé de cache ou la comparaison. Si le protocole destinataire exige une entrée canonique, validez ses règles. Nous ne conseillons pas de modifier une chaîne signée avant sa vérification. Cette comparaison concerne seulement Base64 standard avec remplissage, pas tous les protocoles.
Questions fréquemment posées
Tous les décodeurs acceptent-ils Zh== ?
Non. RFC 4648 autorise le rejet des bits de remplissage non nuls ; une spécification qui le référence peut fixer le comportement. Ces résultats décrivent HTML atob et l’implémentation actuelle de Moyoutil.