跳至內容

Base六十四

出自Taiwan Tongues 台語維基
於 2025年8月22日 (五) 12:38 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Base 六十四(基底六十四)是一種是六十四个會當列印字元來表示二進位資料的表示方法。因為 $ \ log _ { 二 } 六十四=六 $,所以每六个位元為一个單元,對應某一个會當列印字元。三个位元組相當於二十四个位元,對應著四个 Base 六十四單元,即三个位元組可由四个可列印字元來表示。佇咧 Base 六十四中的可列印字元包括字母 ` A-Z `、` a-z `、數字 ` 空九九 `,按呢總共有六十二字,此外兩个會當列印符號佇咧無仝的系統內底猶無仝。一寡如果 uuencode 的其他編碼方法,佮了後 BinHex 的版本使用無仝的六十四字元集來代表六个二進位數字,但是袂去予人叫做 Base 六十四。

Base 六十四常用佇通常咧處理文字資料的場合,表示、傳輸、儲存一寡二進位資料,包括講 MIME 的電子郵件佮 XML 的一寡複雜資料。

RFC 四千六百四十八標準的 Base 六十四索引表

範例

比如講伊,一段參照自托馬斯 ・ 霍布斯《利維坦》的文句:

經過 Base 六十四編碼了後變成:

編碼「Man」的結果為著 ` TWFu `,詳細原理如下:

佇咧這个例中,Base 六十四演算法將三个位元組編碼為四个字元。

若欲編碼的位元組數袂當予人三整除,上尾仔會加出一个抑是兩个位元組,遐爾會當使用下跤的方法進行處理:先使用空位元組值佇尾尾補足,使其會當被三整除,才閣進行 Base 六十四的編碼。咧編這个碼後的 Base 六十四文字後加上一个抑是兩个 `=` 號,代表補足的位元組數。也就是講,當最後賰兩个八位 ( 補足 ) 位元組(兩个 byte)時,最後一个六位的 Base 六十四位箍組塊有四位是零值,最後附加上兩个等號;若尾仔賰一个八位 ( 補足 ) 位元組(一个 byte)時,最後一个六位的 base 位元組塊有兩位是零值,最後附加一个等號。 參考下表:

應用

反種

base 六十四編碼對應的六十四个可列印字元佇一寡特定的程式抑是協定中可能無適合使用,特別是字元表第六十二位(` + `)、 六十三位(` / `)佮添充字元(`=`), 因此存在一寡如下的變種:

MIME

佇咧 MIME 格式的電子批內底,Base 六十四會當用來將 binary 的位元組序列資料編碼成 ASCII 字元序列構成的文字。用的時陣,佇傳輸編碼方式當中指定 Base 六十四。使用的字元包括大小寫拉丁字母各二十六个、數字十个、加號 ` + ` 佮斜槓 ` / `,攏總六十四字元,等號 `=` 用來做添充用途。

完整的 Base 六十四定義可見 RFC 一千四百二十一佮 RFC 兩千空四十五。編碼了後的資料比原始的資料略長,為原來的 $ { \ frac { 四 } { 三 } } $。佇咧電子批內底,根據 RFC 八百二十二規定,每七十六字元,猶閣需要加一个 Enter 換行。通估算編碼了後資料長度大約是原長的百分之一百三十五謼一。

轉換的時陣,共三位元組的資料,先後囥入一个二十四位元的緩衝區內底,先來的位元組占高位。資料若無夠三位元組,佇緩衝區內底賰的位元用零補足。逐改取出六位元(因為乎 $ 二 ^ { 六 }=六十四 $), 照顧其值選擇 ` ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 一石兩千三百四十五五鋪六千七百八十九 + / ` 中的字元作為編碼了後的輸出,一直到全部輸入資料轉換完成。

啊若原資料長度毋是三的倍數的時陣賰一个輸入數據,是咧編碼結果了後加兩个 `=`;若賰兩个輸入數據,則咧編碼結果了後加一个 `=`。

IRCu

佇咧 IRCu 等軟體所使用的 P 十 IRC 侍服器間協定,著客戶佮侍服器的訊息類型號(client / server numerics)佮第二進位 IP 位址採用矣 Base 六十四編碼。訊息類型號的長度固定做三位元組,故故會當直接編碼為四个位元組無需要加添充。著 IP 位址來做編碼的時陣,需要佇位址頭前添加一寡零位元,使用會當編碼做整數一个位元組。遮所用的符號集佮前述 MIME 的嘛有無仝款,將 ` + / ` 改做矣 ` [ ] `。

UTF 鋪七

UTF 鋪七是一个修改版 Base 六十四(Modified Base 六十四)。 主要是將 UTF 鋪十六的資料,用 Base 六十四的方法編碼是會當列印的 ASCII 字元序列。目的是傳輸 Unicode 資料。所以主要的區別在免等號 `=` 補餘,因為彼字元通常需要大量的轉譯。

標準可見 RFC 兩千一百五十二,《 A Mail-Safe Transformation Format of Unicode》。

URL

Base 六十四編碼會當用佇咧 HTTP 環境下傳達較長的標識資訊。比如講,佇咧 Java 維持久化系統 Hibernate 中,就採用矣 Base 六十四來將一个較長的唯一識別碼(一般為一百二十八-bit 的 UUID)編碼為一字攕,用作 HTTP 表單佮 HTTP GET URL 中的參數。佇其他應用程式當中,嘛定定需要共兩進位資料編碼做適合囥佇 URL(包括隱藏表單域)中的形式。現此時,採用 Base 六十四編碼毋但較簡單,仝一个時陣嘛有不可讀性,即所編碼的資料袂去予人用肉眼所直接看著。

毋過,標準的 Base 六十四並無適合直接囥佇 URL 內底傳輸,因為乎 URL 編碼器會共標準 Base 六十四中的 ` / ` 和 ` + ` 字元變做形如講 ` % XX ` 彼个形體,啊若遮的 ` % ` 號佇存入資料庫的時陣閣需要再進行轉換,因為乎 ANSI SQL 中已經將 ` % ` 號用萬用字元。

為著欲解決這个問題,會當採用一種用佇咧 URL 的改進 Base 六十四編碼,伊無佇咧尾添充去 `=` 號,並將標準 Base 六十四中的 ` + ` 和 ` / ` 分別改做矣 `-` 和 ` _ `,按呢就免去矣佇咧 URL 編解碼佮資料庫儲存的時陣所愛做的轉換,避免編碼的資訊長度佇這內底來增加,並統一了資料庫、表單等等的物件識別碼的格式。

另外有一款用佇正規表示式的改進 Base 六十四反種,伊將 ` + ` 和 ` / ` 改做矣 ` ! ` 和 `-`,因為乎 ` + `,` * ` 以及頭前佇咧 IRCu 中用著的 ` [` 和 `] ` 佇正規表示式內底攏有可能有特殊含義。

另外閣有一寡變種,伊共這 ` + / ` 改做 ` _-` 抑是 ` . _ `(用作程式語言中的識別碼名稱)抑是 ` .-`(用佇咧 XML 中的 _ Nmtoken _)甚至 ` _ : `(用佇咧 XML 中的 _ Name _)。

其他

  • 糞埽訊息傳播者用 Base 六十四來避過反糞埽郵件工具,因為遐的家私頭仔攏袂曉翻譯 Base 六十四的訊息。
  • 佇咧 LDIF 檔案,Base 六十四用做編碼字捾。

相關事件

  • 二空一八年二月電子郵件程式 Exim 發現重大的空縫,編號做 CVE 鋪二千空一十八追六千七百八十九的緩衝區有溢个空隙許攻擊者咧侍服器上遠端執行惡意代碼。落勾去 base 六十四解碼函式當中,影響 Exim v 四配九空 . 一進前的所有的版本,加達到四十萬侍服器受著影響。

參見

  • Base 五十八
  • Radix 被六十四
  • Ascii 八十五
  • Quoted-printable
  • uuencode
  • yEnc
  • 八 BITMIME
  • URL

參考資料

外部連結

  • RFC 一千四百二十一(Privacy Enhancement for Electronic Internet Mail)
  • RFC 兩千空四十五(MIME)
  • RFC 三千五百四十八(The Base 十六 , Base 三十二 , and Base 六十四 Data Encodings)佇咧 RFC 四千六百四十八中被替代
  • Home of the Base 六十四 specification , with an online decoder and C 九十九 implementation