Perl-与base64之间的编码

Perl-与base64之间的编码,perl,base64,encode,Perl,Base64,Encode,我编写了以下脚本来将文件从base64转换为base64 # Setup default mode my $mode = ''; my $encoding = 'base64'; my $file = ''; GetOptions( 'mode=s' => \$mode, # mode = Encode / decode 'help!' => \$help, # help message 'encoding=s' => \$e

我编写了以下脚本来将文件从base64转换为base64

# Setup default mode
my $mode = '';
my $encoding = 'base64';
my $file = '';


GetOptions(
'mode=s'        => \$mode,  # mode = Encode / decode
'help!'         => \$help,      # help message
'encoding=s'    => \$encoding,
'file=s'        => \$file
) or die "Incorrect usage!\n";

if( $help ) {
print "Common on, it's really not that hard.\n";
} else {
print "# Script parameters provided : \n";
print "# Mode set to $mode.\n";
print "# Encoding is set to $encoding\n";
print "# Input File set to $file \n";
}


open(FILE, "$file") or die "$!";
open FILEOT, ">$file.out" or die "$!";  
binmode FILEOT;
binmode STDOUT; 

switch ($mode) {

case "encode" { 

        print "# Encoding file $file to $encoding \n";
        print "# Processing .... \n\n";

        while (read(FILE, $buf, 60*57)) {
            $encoded = encode_base64($buf);
            print $encoded;
            print FILEOT $encoded;
        }
}

case "decode" {
        print "# Decoding file $file from $encoding \n";
        print "# Processing .... \n\n";

        while ( read(FILE, $buf, 60*57 ) {
            $decoded = decode_base64($buf);
            print $decoded;
            print FILEOT $decoded;
          }
       }
编码部分按预期工作。解码部分不给出任何输出。我给了它一个类似的输入文件:

 My name is John
 I eat pineapples

它没有输出。我认为,在解码之前已使用此脚本编码的文件时,可能不需要缓冲读取。我使用上面的测试生成base64编码版本,但反向测试没有给出任何结果。有人能帮我吗?

按块编码/解码不起作用。由于每60*57=3420字节重新启动一次,因此编码将导致比必要时更大的输出,但对于解码,3420字节将不是一个完整的Base64块。查看结果,您可能会看到以some=chars结尾的未完全填充的行

下面是一个区块大小为10的简短示例,用于演示:

use MIME::Base64 qw(encode_base64);

my $in = "abcdefghijklmnopqrstuvwxyz";
while (my $block = substr($in,0,10,"")) {
    print encode_base64($block);
}

YWJjZGVmZ2hpag==
a2xtbm9wcXJzdA==
dXZ3eHl6
尝试在10个字符的块中解码将尝试解码以下字符串:

YWJjZGVmZ2
hpag==\na2x
tbm9wcXJzd
A==\ndXZ3eH
l6\n
第一行正确地转换为abcdefg,但第二行被解码为垃圾


有一个名为base64的命令行工具,其功能完全相同:对base64文件进行编码和解码。您应该删除分块处理,对文件进行编码,并尝试使用命令行工具对其进行解码,前提是它做得正确。如果这是工作,你的编码也工作,否则你的编码可能不工作。让它工作起来,然后继续解码部分。

您应该阅读有关PerlIO层的内容。你也对这个模块感兴趣


除非发布您正在运行的真实代码,否则您将无法获得问题的有用答案。读文件时,$buf,60*57{这一行有不平衡的括号,我确信这些代码都没有达到预期的效果。您还必须始终在编写的每个Perl程序的顶部使用strict和“all”警告;除非它们已就位,否则使用my没有什么意义
 use PerlIO::via::Base64 eol => "\n";

 open( my $in,'<:via(Base64)','file.mime' )
  or die "Can't open file.mime for reading: $!\n";

 open( my $out,'>:via(Base64)','file.mime' )
  or die "Can't open file.mime for writing: $!\n";