#!/usr/local/bin/perl5 -w # From RFC 2045: # Table 1: The Base64 Alphabet # Value Encoding Value Encoding Value Encoding Value Encoding # 0 A 17 R 34 i 51 z # 1 B 18 S 35 j 52 0 # 2 C 19 T 36 k 53 1 # 3 D 20 U 37 l 54 2 # 4 E 21 V 38 m 55 3 # 5 F 22 W 39 n 56 4 # 6 G 23 X 40 o 57 5 # 7 H 24 Y 41 p 58 6 # 8 I 25 Z 42 q 59 7 # 9 J 26 a 43 r 60 8 # 10 K 27 b 44 s 61 9 # 11 L 28 c 45 t 62 + # 12 M 29 d 46 u 63 / # 13 N 30 e 47 v # 14 O 31 f 48 w (pad) = # 15 P 32 g 49 x # 16 Q 33 h 50 y $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; $start=0; %basehash=(); foreach $i (split //, $base) { $basehash{$i}=$start; # print $i, " ", $basehash{$i}, " ", $start, "\n"; $start=$start + 1; } while(<>) { chomp; @array = ( split //, $_ ); $twirl = 0; $outchar = 0; $inchar = 0; # Predefine this so it will persist outside the inner loop. while ( ( ( $inchar = shift @array ) or ( defined( $inchar ) ) ) and ( not ( $inchar eq "=" ) ) # Handle base64 pad character. and ( not ( $inchar eq "-" ) ) # Handle missing blank line after data # and before MIME separator, which latter # seems always to start with "--". This # isn't really data for this program, but # including it is a frequent and likely # user error, so cope. ) { # print STDERR "$inchar", "\n"; if ($twirl == 0) { $outchar = $outchar + ( $basehash{$inchar} * 4 ); # print STDERR $twirl, " ", $outchar, "\n"; $twirl = 1; } else { if ($twirl == 1) { $outchar = $outchar + int ( $basehash{$inchar} / 16 ); # print STDERR $twirl, " ", $outchar, "\n"; # print $outchar; # print " ", chr $outchar , "\n"; print chr $outchar; $outchar = ($basehash{$inchar} % 16) * 16; # print STDERR $twirl, " ", $outchar, "\n"; $twirl = 2; } else { if ($twirl == 2) { $outchar = $outchar + int ( $basehash{$inchar} / 4 ); # print STDERR $twirl, " ", $outchar, "\n"; # print $outchar; # print " ", chr $outchar , "\n"; print chr $outchar; $outchar = ( $basehash{$inchar} % 4 ) * 64; # print STDERR $twirl, " ", $outchar, "\n"; $twirl = 3; } else { if ($twirl == 3) { $outchar = $outchar + ( $basehash{$inchar}); # print STDERR $twirl, " ", $outchar, "\n"; # print $outchar; # print " ", chr $outchar , "\n"; print chr $outchar; $outchar = 0; $twirl = 0; } } } } } # if ( $inchar eq "-" ) # { # exit(0); # We've overshot the data; stop reading more lines. # } } # print %basehash;