ホームページ  >  記事  >  Java  >  Javaでbase64エンコーダを実装する方法

Javaでbase64エンコーダを実装する方法

PHPz
PHPz転載
2023-04-28 16:04:221185ブラウズ

はじめに

Base64 エンコードとは何ですか?この質問に答える前に、コンピュータ内のファイルの分類を理解する必要があります。コンピュータの場合、ファイルは 2 つのカテゴリに分類でき、1 つはテキスト ファイル、もう 1 つはバイナリ ファイルです。

バイナリ ファイルの場合、その内容はバイナリで表現されるため、人間にはすぐには理解できません。バイナリ ファイルをテキスト エディタで開こうとすると、意味不明な文字が表示される場合があります。これは、バイナリ ファイルのエンコード方法がテキスト ファイルのエンコード方法と異なるため、テキスト エディタでバイナリ ファイルをテキスト コンテンツに変換しようとすると文字化けが発生します。

テキスト ファイルの場合、最も初期の ASCII エンコードや、現在一般的に使用されている UTF-8 や UTF-16 などのエンコード方法が多数あります。テキスト ファイルであっても、別のエンコードを使用して開くと文字化けが発生することがあります。

したがって、テキスト ファイルであってもバイナリ ファイルであっても、エンコード形式を統一する必要があります。言い換えれば、書き込みのエンコーディングがどのようなものであるかに応じて、データの読み取りのエンコーディングもそれに一致する必要があります。

Base64 エンコードは、実際にはバイナリ データを視覚的な ASCII 文字にエンコードするエンコード方法です。

なぜそのような要件があるのでしょうか?

コンピューターの世界の発展は一夜にして起こるものではなく、ゆっくりとした成長のプロセスであることはわかっています。文字エンコーディングは、当初は ASCII エンコーディングのみをサポートしていましたが、その後 Unicode などにも拡張されました。したがって、多くのアプリケーションでは、ASCII エンコード以外のエンコード形式はサポートされていません。では、これらのシステムで非 ASCII コードを表示するにはどうすればよいでしょうか?

解決策は、エンコード マッピングを実行して、非 ASCII 文字を ASCII 文字にマッピングすることです。 Base64 はそのようなエンコード方式です。

Base64 を使用する一般的な場所は Web ページです。Web ページに画像を表示する必要がある場合があるため、画像を Base64 でエンコードして HTML に埋め込むことができます。

別のアプリケーションでは、ファイルを Base64 エンコードして、電子メールの添付ファイルとして送信します。

JAVA の Base64 サポート

Base64 エンコードは非常に使いやすいので、JAVA での Base64 実装を見てみましょう。

Java には、java.util.Base64 と呼ばれる、対応する Base64 実装があります。このクラスは、JDK バージョン 1.8 で導入された Base64 用のツール クラスです。

Base64 には getEncoder と getDecoder の 3 つのメソッドが用意されており、対応する Encoder と Decoder を取得すると、エンコーダの encode メソッドと decode メソッドを呼び出してデータをエンコードおよびデコードできるため、非常に便利です。

まず、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"));

ツール クラスとしては、JDK で提供されている Base64 ツール クラスが依然として非常に便利です。

ここでは詳しい使い方は説明しませんが、この記事では主に Base64 が JDK でどのように実装されているかを分析します。

JDK における Base64 の分類と実装

JDK の Base64 クラスには、getEncoder、getUrlEncoder、getMimeEncoder という 3 つのエンコーダ メソッドが用意されています。

    public static Encoder getEncoder() {
         return Encoder.RFC4648;
    }

    public static Encoder getUrlEncoder() {
         return Encoder.RFC4648_URLSAFE;
    }

    public static Encoder getMimeEncoder() {
        return Encoder.RFC2045;
    }

同様に、対応する 3 つのデコーダは次のとおりです。 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;
    }

コードからわかるように、これら 3 つのエンコーディングはそれぞれ RFC4648、RFC4648_URLSAFE、および RFC2045 に対応しています。

これら 3 つは Base64 エンコーディングの変形です。その違いを見てみましょう:

必須 RFC 4648:base64url (URL およびファイル名に安全な標準)-
エンコーディング名 エンコードされた文字 エンコードされた文字 エンコードされた文字
62 桁目 63 桁目 完了文字
RFC 2045: MIME の Base64 転送エンコード / =
#RFC 4648:base64 (標準) / #= オプション
= オプション
ご覧いただけますBase64 と Base64url の違いは、62 番目と 63 番目のエンコード文字が異なることであり、MIME の Base64 と Base64 の違いは、補完文字が必須かどうかです。

さらに、Basic と Base64url の場合、行区切り文字は追加されませんが、MIME の Base64 では、行が 76 文字を超えると行区切り文字として「\r」と「\n」が追加されます。

最後に、デコード プロセス中に、Base64 マッピング テーブルに見つからない文字が別の方法で処理される場合、base64 と Base64url は直接拒否されますが、MIME の Base64 は無視されます。

base64 と Base64url の違いは、次の 2 つの方法で確認できます。

        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', '-', '_'
        };

MIME の場合、1 行の最大文字数と改行文字が定義されます。

        private static final int MIMELINEMAX = 76;
        private static final byte[] CRLF = new byte[] {'\r', '\n'};

Base64 の高度な使用方法

一般に、Base64 でエンコードするオブジェクトの長さは固定されており、エンコード メソッドまたはデコード メソッドを呼び出すために入力オブジェクトをバイト配列に変換するだけで済みます。

しかし、場合によっては、ストリーム データを変換する必要があります。このとき、Base64 で提供される Stream をラップする 2 つのメソッドを使用できます:

        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);
        }

これら 2 つのメソッドは、それぞれエンコーダとエンコーダに対応します。デコーダ。

以上がJavaでbase64エンコーダを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。