#!/usr/local/bin/perl # make_huffman.pl # Creates the huffman JAPH proggie $s = 'print"Just Another Perl Hacker.\n";'; #$s = 'abcde'; print "\nEncoding:\n'$s'\n\n"; $l = unpack("H*",$s); print unpack("B*",$s); print "\n\n$l\n\n"; @n = split(/ */,$l); # Find the frequencies foreach $i (@n) { $freq{$i}++; } # Create the table foreach $f (sort keys %freq) { # print "$f - $freq{$f}\n"; $t[$#t+1] = [$freq{$f},$f]; } while($#t > 0) { @t = map {$_->[1]} sort {$b->[0] <=> $a->[0]} map {[$_->[0], $_]} @t; $a = pop @t; $b = pop @t; $c = $a->[0]+$b->[0]; $d = [$c,[$a->[1],$b->[1]]]; push @t,$d; } sub get_table { my $t = shift; my $s = shift; my $l,$r; if(ref($t)) { $l = get_table($t->[0],$s.'0',$d+1); $r = get_table($t->[1],$s.'1',$d+1); return "[$l,$r]"; } else { $huff{$t} = $s; return $t; } } $htbl = get_table($t[0]->[1]); print "Encoding Table:\n"; foreach $a (sort keys %huff) { print "$a -> $huff{$a}\n"; } for $i (0..$#n) { $enc .= $huff{$n[$i]}; } @n = split(/(......)/,$enc); for $i (0..@n) { $new_l .= pack("B*",'00'.$n[$i]) if $i%2; } print "\nEncoded String:\n'$new_l'\n",length $new_l; @tmp = unpack("C*",$new_l); for$t(@tmp){print "$t\t",$t^8,"\n"} print unpack("B*",$new_l),"\n"; print "\n$htbl\n"; $dec = (eval $htbl); $c = $dec; @l = split(/ */,unpack("B*",$new_l)); for$i(0..$#l) { if($i%8>1) { print $l[$i]; if($l[$i]){$c=$c->[1]}else{$c=$c->[0]} unless(ref($c)){$o.=$c;$c=$dec} } } print "-->\n$o\n\n"; print "'",pack("H*",$o),"'\n"; eval(pack("H*",$o)); print <<"ENDPRINT"; ----------------------------- \$dec=eval'$htbl' ;\$c=\$dec;\@l=split(/ */,unpack("B*",'$new_l'));for\$i( 0..\$#l){if(\$i%8){print\$l[\$i];if(\$l[\$i]){\$c=\$c->[1]}else{\$c=\$c->[0]} unless(ref(\$c)){\$o.=\$c;\$c=\$dec}}}eval(pack("H*",\$o)) ENDPRINT