2016-05-08 12 views
-1

Ich habe das folgende Skript geschrieben, um Dateien von und nach base64 zu konvertieren.Perl - Codierung von und zu 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; 
      } 
     } 

Das Codierungsteil funktioniert wie vorgesehen. Der Dekodierungsteil gibt keine Ausgabe. Ich gab ihm eine Eingabedatei der Likes:

My name is John 
I eat pineapples 

und es gibt keine Ausgabe. Ich denke, das gepufferte Lesen wird möglicherweise nicht benötigt, wenn eine bereits mit diesem Skript codierte Datei dekodiert wird. Ich habe den obigen Test verwendet, um die base64-Encoding-Version zu erstellen, aber die umgekehrte gibt nichts. Kann mir jemand helfen?

+1

Sie werden nicht hilfreiche Antworten auf Ihre Frage erhalten, wenn Sie die * real-Code * schreiben, die ausgeführt werden. Die Zeile 'while (read (FILE, $ buf, 60 * 57) {' hat unausgeglichene Klammern, und ich bin sicher, dass * keiner * dieses Codes "wie vorgesehen funktioniert". Sie müssen auch * immer * 'strict' und verwenden 'Verwenden Sie Warnungen 'all'' oben in jedem Perl-Programm, das Sie schreiben, es ist sehr wenig sinnvoll,' my' zu verwenden, wenn sie nicht vorhanden sind – Borodin

Antwort

4

Die blockweise Kodierung/Dekodierung funktioniert nicht. Die Codierung führt zu einer größeren Ausgabe als erforderlich, da Sie alle 60 * 57 = 3420 Byte neu starten, aber für die Decodierung sind 3420 Byte kein vollständiger Base64-Block. Sehen Sie sich Ihr Ergebnis an, Sie werden wahrscheinlich nicht vollständig ausgefüllte Zeilen sehen, die mit einigen = Zeichen enden.

Hier ist eine kurze Probe mit einer Blockgröße von 10 für die Demonstration:

use MIME::Base64 qw(encode_base64); 

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

YWJjZGVmZ2hpag== 
a2xtbm9wcXJzdA== 
dXZ3eHl6 

Der Versuch, dies von 10 Zeichen in den Blöcken zu entschlüsseln versuchen, diese Zeichenfolgen zu entschlüsseln:

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

Die erste Zeile korrekt übersetzt in abcdefg, aber die zweite Zeile wird in Müll dekodiert.

Es gibt ein Befehlszeilenprogramm namens base64, das genau das gleiche tut: Base64-Dateien codieren und decodieren. Sie sollten diese blockweise Verarbeitung entfernen, eine Datei kodieren und versuchen, sie mit dem Befehlszeilentool zu entschlüsseln (vorausgesetzt, dass es die Dinge richtig macht). Wenn dies funktioniert, funktioniert auch Ihre Codierung, sonst funktioniert Ihre Codierung wahrscheinlich nicht. Machen Sie es in Ordnung und fahren Sie mit dem Dekodierungsteil fort.

1

Sie sollten über PerlIO-Schichten lesen. Auch sind Sie interessiert PerlIO::via::Base64 Modul

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";