org.apache.commons.codec源碼闡述

一、什麼是org.apache.commons.codec?

org.apache.commons.codec是一組對數據編碼進行處理的Java包,它提供了多種常見的編碼方法,例如:Base64、URL、Hex、Quoted-printable等等。它不僅僅提供編碼的方法,還提供了一些與編碼有關的工具類和一些擴展的編碼類型,本篇文章將重點關注於Base64編碼的實現細節,以及Hex編碼和URL編碼的區別。並且提供一些代碼示例介紹。

二、Base64編碼實現細節

Base64是一種將任意二進位數據以文本形式進行編碼的方法, Base64對於二進位數據的處理能力非常強大,它可以編碼任何字符集中的任何字元,並且編碼後的結果都可以上傳或者傳輸,但是編碼結果的文本長度會比原始二進位數據長度大。Base64編碼的實現細節通常需要包括以下幾點:

1、編碼表的生成

public static final byte[] ENCODE_TABLE = {
    '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', '+', '/'
};

2、剩餘位元組的計算

Base64每次對指定長度的數據編碼時,需要考慮最後剩餘的位元組數,一般會在最後添加1至2個「=」(即Padding),使編碼後的數據長度滿足4的倍數,例如:如果最後剩餘3個位元組,則需要添加1位元組的Padding;如果最後剩餘2個位元組,則需要添加2位元組的Padding。這裡是以byte[]為例進行計算,實際上涉及到其他類型時需要對應調整。

if (remaining == 0) {
        encoded[outputIndex++] = ENCODE_TABLE[ buffer[0] >> 2 ];
        encoded[outputIndex++] = ENCODE_TABLE[ (buffer[0] & 0x03) <> 2 ];
        encoded[outputIndex++] = ENCODE_TABLE[ ( (buffer[0] & 0x03) <> 4 ) ];
        encoded[outputIndex++] = ENCODE_TABLE[ (buffer[1] & 0x0f) <> 2 ];
        encoded[outputIndex++] = ENCODE_TABLE[ ( (buffer[0] & 0x03) <> 4 ) ];
        encoded[outputIndex++] = ENCODE_TABLE[ ( (buffer[1] & 0x0f) <> 6 ) ];
        encoded[outputIndex++] = ENCODE_TABLE[ buffer[2] & 0x3f ];
}

3、將「=」 Padding 去除

Base64編碼的結果中可能會包含1至2個「=」字元,這是通過在最後補充數據位元組的方式來實現數據長度補齊的,但也會使得編碼結果的長度增加。因此,對於某些應用場景有去除「=」字元的需求。例如:當使用SMTP發送郵件時,Base64編碼的數據傳輸必須考慮行長度的限制,經由信道進行數據傳輸時還需考慮二進位數據中可能存在像”.”這樣的特殊字元,所以SMTP服務通常會對每行數據進行截斷和連接。去掉Base64編碼結果中的「=」字元可以有效的增加數據字元的密度,減少數據在網路傳輸中帶寬的消耗。

public static byte[] decode(String source, boolean removePadding) {
        byte[] data = decode(source);
        if (removePadding) {
            int paddingCount = 0;
            for (int i = data.length - 1; i >= 0; i--) {
                if (data[i] == '=') {
                    paddingCount++;
                } else {
                    break;
                }
            }
            if (paddingCount > 0) {
                byte[] temp = new byte[data.length - paddingCount];
                System.arraycopy(data, 0, temp, 0, temp.length);
                return temp;
            }
        }
        return data;
}

三、Hex編碼和URL編碼的區別

雖然Hex和URL編碼與Base64編碼類似,但是它們的具體實現方式不同,也有不同的應用場景。

1、Hex編碼

Hex編碼是一種將二進位數據轉化為十六進位字元串的方法。Hex編碼常使用在各種數據存儲和傳輸場景,例如將一個電子郵件地址的發件人、收件人、主題和正文數據轉換為十六進位字元串。Hex編碼還可以使得程序更方便的處理、存儲和傳輸二進位數據,因此在某些極端情況下,例如程序進行加密解密時也非常常見。

String result = Hex.encodeHexString( byteArray );
byte[] byteArray = Hex.decodeHex( result.toCharArray() );

2、URL編碼

URL編碼和Base64編碼一樣,是一種將任意二進位數據轉化為字符集合的方法,但和Base64不同的是,URL編碼在編碼過程中要將一些具有特殊含義的字元,例如:「/」,「?」,「=」等字元換成其他字元以實現編碼,這樣可以保證編碼數據和URL之間沒有任何的衝突,也使得URL編碼在數據存儲和傳輸的場景中更適用並且更安全。

String source = "http://www.google.com";
String result = URLEncoder.encode( source, StandardCharsets.UTF_8.toString() );
String result = URLDecoder.decode( result, StandardCharsets.UTF_8.toString() );

原創文章,作者:KXJF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138353.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KXJF的頭像KXJF
上一篇 2024-10-04 00:19
下一篇 2024-10-04 00:19

相關推薦

  • 雲智直聘 源碼分析

    本文將會對雲智直聘的源碼進行分析,包括前端頁面和後端代碼,幫助讀者了解其架構、技術實現以及對一些常見的問題進行解決。通過本文的閱讀,讀者將會了解到雲智直聘的特點、優勢以及不足之處,…

    編程 2025-04-29
  • Apache配置Python環境

    Apache是一款流行的Web伺服器軟體,事實上,很多時候我們需要在Web伺服器上使用Python程序做為數據處理和前端網頁開發語言,這時候,我們就需要在Apache中配置Pyth…

    編程 2025-04-28
  • Python網站源碼解析

    本文將從多個方面對Python網站源碼進行詳細解析,包括搭建網站、數據處理、安全性等內容。 一、搭建網站 Python是一種高級編程語言,適用於多種領域。它也可以用於搭建網站。最常…

    編程 2025-04-28
  • 源碼是什麼

    源碼是一段計算機程序的原始代碼,它是程序員所編寫的可讀性高、理解性強的文本。在計算機中,源碼是指編寫的程序代碼,這些代碼按照一定規則排列,被計算機識別並執行。 一、源碼的組成 源碼…

    編程 2025-04-27
  • Go源碼閱讀

    Go語言是Google推出的一門靜態類型、編譯型、並髮型、語法簡單的編程語言。它因具有簡潔高效,內置GC等優秀特性,被越來越多的開發者所鍾愛。在這篇文章中,我們將介紹如何從多個方面…

    編程 2025-04-27
  • Apache偽靜態配置Java

    本文將會從多個角度闡述如何在Apache中正確偽裝Java應用程序,實現URL的靜態化,提高網站的SEO優化和性能。以下是相關的配置和代碼實例。 一、RewriteEngine的配…

    編程 2025-04-27
  • 如何解決org.apache.tomcat.util.net.nioendpoint套接字處理器出錯?

    org.apache.tomcat.util.net.nioendpoint套接字處理器一般是指Tomcat伺服器的套接字處理器,在Tomcat伺服器中佔據著非常重要的位置。如果出…

    編程 2025-04-27
  • Python怎麼看源碼

    本文將從以下幾個方面詳細介紹Python如何看源碼,幫助讀者更好地了解Python。 一、查看Python版本 在查看Python源碼之前,首先需要確認Python版本。可以在命令…

    編程 2025-04-27
  • 源碼審計面試題用法介紹

    在進行源碼審計面試時,可能會遇到各種類型的問題,本文將以實例為基礎,從多個方面對源碼審計面試題進行詳細闡述。 一、SQL注入 SQL注入是常見的一種攻擊方式,攻擊者通過在輸入的參數…

    編程 2025-04-27
  • 使用repo.osgeo.org和maven.aliyun.com搭建Maven私服

    本文將詳細講解如何通過repo.osgeo.org和maven.aliyun.com兩個平台,搭建一個Maven私服。 一、註冊repo.osgeo.org賬號 repo.osge…

    編程 2025-04-27

發表回復

登錄後才能評論