Maison > Java > javaDidacticiel > le corps du texte

Comment implémenter l'encodeur base64 en Java

PHPz
Libérer: 2023-04-28 16:04:22
avant
1167 Les gens l'ont consulté

Introduction

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.

Support JAVA pour base64

É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"));
Copier après la connexion

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.

Classification et implémentation de Base64 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;
    }
Copier après la connexion

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;
    }
Copier après la connexion

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 :

/=</code > Obligatoire</table><p></p> <p>RFC 4648 : base64 (standard)</p><p><code>+

/

= 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 = {
            &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;, &#39;M&#39;,
            &#39;N&#39;, &#39;O&#39;, &#39;P&#39;, &#39;Q&#39;, &#39;R&#39;, &#39;S&#39;, &#39;T&#39;, &#39;U&#39;, &#39;V&#39;, &#39;W&#39;, &#39;X&#39;, &#39;Y&#39;, &#39;Z&#39;,
            &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;h&#39;, &#39;i&#39;, &#39;j&#39;, &#39;k&#39;, &#39;l&#39;, &#39;m&#39;,
            &#39;n&#39;, &#39;o&#39;, &#39;p&#39;, &#39;q&#39;, &#39;r&#39;, &#39;s&#39;, &#39;t&#39;, &#39;u&#39;, &#39;v&#39;, &#39;w&#39;, &#39;x&#39;, &#39;y&#39;, &#39;z&#39;,
            &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;+&#39;, &#39;/&#39;
        };
Copier après la connexion
        private static final char[] toBase64URL = {
            &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;, &#39;M&#39;,
            &#39;N&#39;, &#39;O&#39;, &#39;P&#39;, &#39;Q&#39;, &#39;R&#39;, &#39;S&#39;, &#39;T&#39;, &#39;U&#39;, &#39;V&#39;, &#39;W&#39;, &#39;X&#39;, &#39;Y&#39;, &#39;Z&#39;,
            &#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;h&#39;, &#39;i&#39;, &#39;j&#39;, &#39;k&#39;, &#39;l&#39;, &#39;m&#39;,
            &#39;n&#39;, &#39;o&#39;, &#39;p&#39;, &#39;q&#39;, &#39;r&#39;, &#39;s&#39;, &#39;t&#39;, &#39;u&#39;, &#39;v&#39;, &#39;w&#39;, &#39;x&#39;, &#39;y&#39;, &#39;z&#39;,
            &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;-&#39;, &#39;_&#39;
        };
Copier après la connexion
🎜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[] {&#39;\r&#39;, &#39;\n&#39;};
Copier après la connexion
🎜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);
        }
Copier après la connexion
        public InputStream wrap(InputStream is) {
            Objects.requireNonNull(is);
            return new DecInputStream(is, isURL ? fromBase64URL : fromBase64, isMIME);
        }
Copier après la connexion
🎜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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!
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)-_=