2016-05-08 11 views
-1

ファイルをbase64との間で変換するためのスクリプトを作成しました。Perl - 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エンコーディングバージョンを生成しましたが、その逆は何も与えません。誰でも助けてくれますか?

+1

に興味があります。あなたが実行している*実際のコード*を投稿しない限り、あなたの質問に役立つ回答は得られません。 'while(read(FILE、$ buf、60 * 57){' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'あなたが書いたすべてのPerlプログラムの先頭に 'all'という警告文を使用します; myが' 'my''を使用しているのであれば、 – Borodin

答えて

4

ブロック単位のエンコード/デコードは機能しません。 60 * 57 = 3420バイトごとに再起動するため、エンコーディングは必要以上に大きな出力になりますが、デコードでは3420バイトは完全なBase64ブロックにはなりません。あなたの結果を見てみると、おそらく、完全な塗りつぶしの行は、=の文字で終わっているとは思われません。ここで

は、デモンストレーションのために10のブロックサイズと短いサンプルです:10文字のブロックでこれを解読しようとすると

use MIME::Base64 qw(encode_base64); 

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

YWJjZGVmZ2hpag== 
a2xtbm9wcXJzdA== 
dXZ3eHl6 

は、これらの文字列をデコードしようとします:

YWJjZGVmZ2 
hpag==\na2x 
tbm9wcXJzd 
A==\ndXZ3eH 
l6\n 

最初の行abcdefgに正しく変換されますが、2行目はガベージにデコードされます。

exc33ly同じことを行うbase64というコマンドラインツールがあります。Base64ファイルをエンコードしてデコードします。ブロック単位の処理を削除し、ファイルをエンコードし、コマンドラインツールを使用してデコードするようにしてください(正しいことを前提としています)。これがうまくいけば、あなたのエンコードもうまくいきます。さもなければあなたのエンコードはおそらく動作しません。それを動作させ、デコード部に進みます。

1

PerlIOレイヤについては、読んでください。また、PerlIO::via::Base64モジュール

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"; 
関連する問題