內容

名稱

MIME::Base64 - 編碼和解碼 base64 字串

語法

use MIME::Base64;

$encoded = encode_base64('Aladdin:open sesame');
$decoded = decode_base64($encoded);

說明

此模組提供函式,用於將字串編碼和解碼成 RFC 2045 - MIME (多用途網際網路郵件擴充功能) 中指定的 base64 編碼。base64 編碼旨在以不必人類可讀的形式表示任意序列的八位元組。使用 US-ASCII 的 65 個字元子集 ([A-Za-z0-9+/=]),讓每個可列印字元可以表示 6 個位元組。

提供以下主要函式

encode_base64( $bytes )
encode_base64( $bytes, $eol );

透過呼叫 encode_base64() 函式來編碼資料。第一個參數是要編碼的位元組字串。第二個參數是要使用的行尾序列。它是選用的,預設為「\n」。傳回的編碼字串會分成每一行不超過 76 個字元,而且會以 $eol 結尾,除非它是空的。如果您不希望將編碼字串分成多行,請傳遞一個空字串作為第二個參數。

如果 $bytes 包含編碼超過 255 的字元,函式會發生「子常式輸入中出現寬字元」的錯誤。base64 編碼僅定義給單位元組字元。使用 Encode 模組來選擇您想要的位元組編碼。

decode_base64( $str )

透過呼叫 decode_base64() 函數來解碼 base64 字串。此函數會接收一個引數,也就是要解碼的字串,並傳回已解碼的資料。

任何不屬於 65 字元 base64 子集的字元都會被自動忽略。在 '=' 填補字元之後出現的字元永遠不會被解碼。

如果您不想將這些常式匯入您的命名空間,您可以呼叫它們為

use MIME::Base64 ();
$encoded = MIME::Base64::encode($decoded);
$decoded = MIME::Base64::decode($encoded);

預設未匯出的其他函數

encode_base64url( $bytes )
decode_base64url( $str )

根據「URL 應用程式」[1] 的 base64 架構編碼和解碼。這是 base64 編碼的變體,它不使用填補、不將字串斷成多行,並使用字元「-」和「_」取代「+」和「/」,以避免使用保留的 URL 字元。

encoded_base64_length( $bytes )
encoded_base64_length( $bytes, $eol )

傳回編碼字串的長度,而不會實際編碼它。這會傳回與 length(encode_base64($bytes)) 相同的值,但應該會更有效率。

decoded_base64_length( $str )

傳回解碼字串的長度,而不會實際解碼它。這會傳回與 length(decode_base64($str)) 相同的值,但應該會更有效率。

範例

如果您要編碼一個大型檔案,您應該將它編碼成 57 位元組的倍數區塊。這可確保 base64 行對齊,且您不會在中間結束填補。57 位元組的資料會填滿一個完整的 base64 行 (76 == 57*4/3)

use MIME::Base64 qw(encode_base64);

open(FILE, "/var/log/wtmp") or die "$!";
while (read(FILE, $buf, 60*57)) {
    print encode_base64($buf);
}

或者如果您知道您有足夠的記憶體

use MIME::Base64 qw(encode_base64);
local($/) = undef;  # slurp
print encode_base64(<STDIN>);

與命令列相同的方法

perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' <file

如果每一行都包含四個 base64 字元的倍數,則解碼不需要 slurp 模式

perl -MMIME::Base64 -ne 'print decode_base64($_)' <file

Perl v5.8 和更新版本允許字串中使用延伸 Unicode 字元。此類字串無法直接編碼,因為 base64 編碼僅定義為單位元組字元。解決方案是使用 Encode 模組來選擇您要的位元組編碼。例如

use MIME::Base64 qw(encode_base64);
use Encode qw(encode);

$encoded = encode_base64(encode("UTF-8", "\x{FFFF}\n"));
print $encoded;

版權

版權所有 1995-1999、2001-2004、2010 Gisle Aas。

此函式庫是免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

遠距基於 Martijn Koster <m.koster@nexor.co.uk> 和 Joerg Reichelt <j.reichelt@nexor.co.uk> 編寫的 LWP::Base64,以及 Hans Mulder <hansm@wsinti07.win.tue.nl> 張貼到 comp.lang.perl <3pd2lp$6gf@wsinti07.win.tue.nl> 的程式碼

XS 實作使用來自 metamail 的程式碼。版權所有 1991 Bell Communications Research, Inc. (Bellcore)

另請參閱

MIME::QuotedPrint

[1] http://en.wikipedia.org/wiki/Base64#URL_applications