内容

名称

MIME::Base64 - 对 base64 字符串进行编码和解码

概要

use MIME::Base64;

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

描述

此模块提供函数,用于对字符串进行编码和解码,编码和解码方式为 RFC 2045 - MIME(多用途互联网邮件扩展)中指定的 base64 编码。base64 编码旨在以无需人工可读的形式表示任意八位字节序列。使用 65 个字符的 US-ASCII 子集([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 <[email protected]> 和 Joerg Reichelt <[email protected]> 编写的 LWP::Base64 以及 Hans Mulder <[email protected]> 发布到 comp.lang.perl <[email protected]> 的代码。

XS 实现使用了来自 metamail 的代码。版权所有 1991 Bell Communications Research, Inc. (Bellcore)

另请参阅

MIME::QuotedPrint

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