base64で使われているアルゴリズムはいくつかの相違はありますが、
基本的に uuencode/uudecode で使われているものと同一です
(3バイトのデータを4バイトで表現する)。
そして、Perlのpack/unpackはテンプレート文字列 'u' を使うことにより
uuencode/uudecodeすることができます。そこで以下のようなサブルーチン
を使ってBase64のエンコード/デコードができます。
use strict;
use warnings;
use MIME::Base64;
my $base64_pat = "A-Za-z0-9+/";
my $uu_pat = "`!-_";
sub my_encode_base64 {
my $arg = shift;
my $mod3 = length($arg) % 3;
my $tmp = pack 'u', $arg;
$tmp =~ s/^.//msg;
$tmp =~ tr[`!-_][A-Za-z0-9+/];
#substr($tmp, -(3-$mod3), 3-$mod3, q{=} x (3-$mod3));
substr($tmp, -(3-$mod3), 3-$mod3) = q{=} x (3-$mod3) unless $mod3==0;
$tmp;
}
sub my_decode_base64 {
my $arg = shift;
$arg =~ s/=?=$//;
$arg =~ tr[A-Za-z0-9+/][`!-_];
my $len = pack 'c', 32 + 0.75*length($arg);
unpack 'u', $len . $arg;
}
my $str = <<EOS;
こんにちは世界
サンプル文字列
EOS
my $r1 = my_encode_base64($str);
my $r2 = encode_base64($str);
print "\$r1 = $r1\n";
print "\$r2 = $r2\n";
my $r3 = my_decode_base64($r2);
my $r4 = decode_base64($r2);
print "\$r3 = $r3\n";
print "\$r4 = $r4\n";