首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現 Base64 編解碼全解析:原理、Bouncy Castle、Commons Codec 兩大庫實戰

     編輯:Java 相關知識

Base64 算法原理

Base64 將任意二進制數據編碼為 64 個可打印字符(A-Z, a-z, 0-9, +, /),常用於郵件傳輸、數據嵌入。編碼後體積膨脹為原始 4/3 倍,長度為 4 的倍數。

編碼流程

  1. 字符 → ASCII/UTF-8 碼值
  2. 碼值 → 8位二進制
  3. 每 3 個字節 (24位) 重組為 4 個 6位組
  4. 6位組高位補 0 成 8位
  5. 轉十進制 → 查 Base64 字符表

示例: "Ad3" 編碼

字符Ad3
ASCII6510051
二進制010000010110010000110011
6位分組010000 010110 010000 110011
補位後16221651
Base64字符QWQz

結果:QWQz

Base64字符表

Java 標準庫無內置實現,需第三方庫

方案一:Bouncy Castle (輕量、非 RFC 標準)

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>
import org.bouncycastle.util.encoders.Base64;

public class Base64Util {
    static final String ENCODING = "UTF-8";
    
    public static String encode(String data) throws UnsupportedEncodingException {
        return new String(Base64.encode(data.getBytes(ENCODING)), ENCODING);
    }
    
    public static String decode(String data) throws UnsupportedEncodingException {
        return new String(Base64.decode(data.getBytes(ENCODING)), ENCODING);
    }
}

方案二:Apache Commons Codec (標準、支持 RFC 2045/4648)

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>
import org.apache.commons.codec.binary.Base64;

public class Base64Util {
    static final String ENCODING = "UTF-8";
    
    // 標準編碼
    public static String encode(String data) {
        return new String(Base64.encodeBase64(data.getBytes(ENCODING)), ENCODING);
    }
    
    // RFC 標準編碼 (含換行)
    public static String encodeSafe(String data) {
        return new String(Base64.encodeBase64(data.getBytes(ENCODING), true), ENCODING);
    }
    
    public static String decode(String data) {
        return new String(Base64.decodeBase64(data.getBytes(ENCODING)), ENCODING);
    }
}

關鍵差異對比

特性Bouncy CastleCommons Codec
RFC 標準合規否是 (encodeBase64(bytes, true))
API 簡潔度高高
依賴體積較大 (含加密算法)極小 (專注編碼)
推薦場景已引入 BC 做加密純編碼需求、標準合規

現代替代:Java 8+ 內置 Base64

import java.util.Base64;

// 標準編碼
String encoded = Base64.getEncoder().encodeToString("Ad3".getBytes(StandardCharsets.UTF_8));
// URL 安全編碼
String urlSafe = Base64.getUrlEncoder().encodeToString(bytes);
// MIME 編碼 (含換行)
String mime = Base64.getMimeEncoder().encodeToString(bytes);

// 解碼
byte[] decoded = Base64.getDecoder().decode(encoded);
Java 8+ 項目**首選內置 java.util.Base64**,零依賴、標準合規、性能優異。

測試驗證

public static void main(String[] args) throws Exception {
    String original = "Ad3";
    String encoded = Base64Util.encodeSafe(original);
    String decoded = Base64Util.decode(encoded);
    System.out.println("原文: " + original);
    System.out.println("編碼: " + encoded); // QWQz
    System.out.println("解碼: " + decoded);
    assert original.equals(decoded);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved