#!/usr/bin/perl -w # cirno0.pl - Don Yang (uguu.org) # # binary -> base90 encoder # # 09/07/08 use strict; use constant BASE => 90; binmode STDIN; # Encode leading 60 byte blocks my $buffer = ""; my $output; while(my $line = <>) { $buffer .= $line; for(; length($buffer) >= 60; $buffer = substr($buffer, 60)) { $output = ""; foreach my $x (unpack 'V15', $buffer) { my $a = $x % BASE; my $b = ($x /= BASE) % BASE; my $c = ($x /= BASE) % BASE; my $d = ($x /= BASE) % BASE; my $e = $x / BASE; $output .= pack 'C*', $a + 33, $b + 33, $c + 33, $d + 33, $e + 33; } print $output, "\n"; } } # Encode last block my $remainder = (length($buffer) % 4) ? (4 - (length($buffer) % 4)) : 0; $output = ""; foreach my $x (unpack 'V*', $buffer . "\0\0\0") { my $a = $x % BASE; my $b = ($x /= BASE) % BASE; my $c = ($x /= BASE) % BASE; my $d = ($x /= BASE) % BASE; my $e = $x / BASE; $output .= pack 'C*', $a + 33, $b + 33, $c + 33, $d + 33, $e + 33; } for(; $remainder > 0; $remainder--) { chop $output; } print $output, "\n";