Qu'est-ce que l'encodage Base64 ? Avant de répondre à cette question, nous devons comprendre la classification des fichiers dans les ordinateurs. Pour les ordinateurs, les fichiers peuvent être divisés en deux catégories, l’une étant constituée de fichiers texte et l’autre de fichiers binaires.
Pour les fichiers binaires, leur contenu est représenté en binaire, ce qui n'est pas immédiatement compréhensible pour les humains. Si vous essayez d'ouvrir un fichier binaire avec un éditeur de texte, vous risquez de voir du charabia. En effet, la méthode de codage des fichiers binaires est différente de celle des fichiers texte. Ainsi, lorsque l'éditeur de texte tente de traduire les fichiers binaires en contenu texte, des caractères tronqués apparaissent.
Pour les fichiers texte, il existe de nombreuses méthodes de codage, telles que le premier codage ASCII et les méthodes de codage actuellement couramment utilisées telles que UTF-8 et UTF-16. Même les fichiers texte peuvent voir des caractères tronqués si vous les ouvrez en utilisant un encodage différent.
Donc, qu'il s'agisse d'un fichier texte ou d'un fichier binaire, le format d'encodage doit être unifié. En d'autres termes, à quoi ressemble le codage de l'écriture, le codage de la lecture des données doit également y correspondre.
L'encodage Base64 est en fait une méthode d'encodage qui encode les données binaires en caractères visuels ASCII.
Pourquoi y a-t-il une telle exigence ?
Nous savons que le développement du monde informatique ne se fait pas du jour au lendemain. Il s'agit d'un processus de croissance lente. Pour le codage des caractères, il ne prenait en charge que le codage ASCII au début, puis s'est étendu à Unicode, etc. Par conséquent, pour de nombreuses applications, les formats de codage autres que le codage ASCII ne sont pas pris en charge. Alors, comment afficher le code non-ASCII dans ces systèmes ?
La solution consiste à effectuer un mappage d'encodage pour mapper les caractères non-ASCII en caractères ASCII. Base64 est une telle méthode de codage.
L'endroit courant pour utiliser Base64 est dans les pages Web. Parfois, nous devons afficher des images sur des pages Web, afin de pouvoir encoder les images en base64, puis les remplir en HTML.
Une autre application consiste à encoder le fichier en base64, puis à l'envoyer sous forme de pièce jointe à un e-mail.
Étant donné que l'encodage base64 est si facile à utiliser, jetons un coup d'œil à l'implémentation base64 dans JAVA.
Il existe une implémentation base64 correspondante en Java, appelée java.util.Base64. Cette classe est une classe d'outils pour Base64, introduite par JDK dans la version 1.8.
Base64 fournit trois méthodes getEncoder et getDecoder. En obtenant l'Encoder et le Decoder correspondants, vous pouvez ensuite appeler les méthodes d'encodage et de décodage de l'encodeur pour encoder et décoder les données, ce qui est très pratique.
Jetons d'abord un coup d'œil aux exemples d'utilisation de base de Base64 :
// 使用encoder进行编码 String encodedString = Base64.getEncoder().encodeToString("what is your name baby?".getBytes("utf-8")); System.out.println("Base64编码过后的字符串 :" + encodedString); // 使用encoder进行解码 byte[] decodedBytes = Base64.getDecoder().decode(encodedString); System.out.println("解码过后的字符串: " + new String(decodedBytes, "utf-8"));
En tant que classe d'outils, la classe d'outils Base64 fournie dans le JDK est toujours très utile.
Je n'expliquerai pas son utilisation en détail ici. Cet article analyse principalement comment Base64 est implémenté dans le JDK.
La classe Base64 dans le JDK fournit trois méthodes d'encodeur, à savoir getEncoder, getUrlEncoder et getMimeEncoder:
public static Encoder getEncoder() { return Encoder.RFC4648; } public static Encoder getUrlEncoder() { return Encoder.RFC4648_URLSAFE; } public static Encoder getMimeEncoder() { return Encoder.RFC2045; }
De même, elle fournit également trois décodeurs correspondants, à savoir getDecoder , getUrlDecoder, getMimeDecoder:
public static Decoder getDecoder() { return Decoder.RFC4648; } public static Decoder getUrlDecoder() { return Decoder.RFC4648_URLSAFE; } public static Decoder getMimeDecoder() { return Decoder.RFC2045; }
Comme le montre le code, ces trois codages correspondent respectivement à RFC4648, RFC4648_URLSAFE et RFC2045.
Ces trois sont toutes des variantes de l'encodage base64. Jetons un coup d'œil à leurs différences :
Nom d'encodage | Caractère codé | Caractère codé | Caractère codé |
---|---|---|---|
62. ème position | Bit 63 | Caractère complet | |
RFC 2045 : Encodage de transfert Base64 pour MIME |
+ +
|
/ |
= mandatory |
RFC 4648: base64 (standard) | + |
/ |
= optional |
RFC 4648: base64url (URL- and filename-safe standard) | - |
_ |
= |
RFC 4648 : base64 (standard)
+
/
=
optionnel
RFC 4648 : base64url (URL- et standard de sécurité des noms de fichiers)
-
_
=
optionnel🎜🎜🎜🎜🎜peut être vu La différence entre base64 et Base64url signifie que les 62e et 63e caractères codés sont différents, et la différence entre base64 pour MIME et base64 est de savoir si le caractère de complétion est obligatoire. 🎜🎜De plus, pour Basic et base64url, les caractères de séparation de ligne ne seront pas ajoutés, tandis que base64 pour MIME ajoutera « r » et « n » comme séparateurs de ligne après qu'une ligne dépasse 76 caractères. 🎜🎜Enfin, si lors du processus de décodage, il s'avère qu'il y a des caractères qui n'existent pas dans la table de mappage Base64, les méthodes de traitement sont également différentes. Base64 et Base64url le rejetteront directement, tandis que base64 pour MIME l'ignorera. 🎜🎜La différence entre base64 et Base64url peut être vue à travers les deux méthodes suivantes : 🎜private static final char[] toBase64 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
private static final char[] toBase64URL = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' };🎜Pour MIME, il définit le nombre maximum de caractères dans une ligne, et le caractère de nouvelle ligne : 🎜
private static final int MIMELINEMAX = 76; private static final byte[] CRLF = new byte[] {'\r', '\n'};🎜Utilisation avancée de Base64🎜🎜Général dans dans ce cas, la longueur de l'objet que nous encodons avec Base64 est fixe. Il suffit de convertir l'objet d'entrée en un tableau d'octets pour appeler la méthode d'encodage ou de décodage. 🎜🎜Mais dans certains cas, nous devons convertir les données du flux. Dans ce cas, nous pouvons utiliser les deux méthodes d'encapsulation de Stream fournies en Base64 : 🎜
public OutputStream wrap(OutputStream os) { Objects.requireNonNull(os); return new EncOutputStream(os, isURL ? toBase64URL : toBase64, newline, linemax, doPadding); }
public InputStream wrap(InputStream is) { Objects.requireNonNull(is); return new DecInputStream(is, isURL ? fromBase64URL : fromBase64, isMIME); }🎜Ces deux méthodes correspondent respectivement à l'encodeur et au décodeur. 🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!