Article 7462 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:7462
Path: feenix.metronet.com!news.utdallas.edu!wupost!howland.reston.ans.net!europa.eng.gtefsd.com!uunet!pitt.edu!rm55
From: [email protected] (Rudolph T Maceyko)
Newsgroups: comp.lang.perl
Subject: Re: Base 64?
Message-ID: <[email protected]>
Date: 1 Nov 93 09:00:45 GMT
References: <[email protected]>
Sender: [email protected]
Organization: University of Pittsburgh
Lines: 83

In article <[email protected]> [email protected] (Joe McDonald) writes:
>Does anyone have a sub to convert from/to base 64? thanks.
>-joe

If you mean base 64 the way AMS (Andrew Message System) does it, then this
might help you:

# ams.pl: Sunday, 7 June 1992 (16:33) by Rudy Maceyko
#
# based on overhead/mail/lib/genid.c in the ATK distribution
#
# Wednesday, 10 June 1992 (14:56) - changed name to ams.pl from genid.pl;
#       added $AMS_DIRECTORY_PREFIX_STRING from ams/libs/hdrs/ms.h;
#       also stuff from ams/libs/hdrs/ams.h


sub AMS_NUM_UATTRS { 32; }
sub AMS_ATTRNAMEMAX { 16; }

sub AMS_DIRECTORY_PREFIX_STRING { "\003\004\033\277BINARY FILE -- DO NOT EDIT!!!  \n`The mail transport mechanism is trivial.' --Jim Morris\n\n\003\033\277"; }

sub AMS_DIRECTORY_PREFIX_LEN { 96; }
sub AMS_PADSIZE { 10; }
sub ATTNAMESLEN { &AMS_NUM_UATTRS() * &AMS_ATTRNAMEMAX(); }
sub AMS_DIRHEADSIZE { &ATTNAMESLEN() + (1024 - &ATTNAMESLEN)
       + &AMS_SNAPSHOTSIZE(); }


sub AMS_DATESIZE { 7; }
sub AMS_CAPTIONSIZE { 89; }
sub AMS_CHAINSIZE { 4; }
sub AMS_MIDHASHSIZE { 4; }
sub AMS_REPLYHASHSIZE { 4; }
sub AMS_ATTRIBUTESIZE { 21; }
sub AMS_IDSIZE { 19; }

sub AMS_SNAPSHOTSIZE { &AMS_DATESIZE() + &AMS_CAPTIONSIZE() + &AMS_CHAINSIZE()
       + &AMS_MIDHASHSIZE() + &AMS_REPLYHASHSIZE() + &AMS_ATTRIBUTESIZE()
       + &AMS_IDSIZE(); }


@Basis = split('',
       '0123456789:=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');

sub convlongto64
{       local($num, $pad) = @_;

       join('', @Basis[(($num >> 30) & 003) | (($pad & 017) << 2),
               ($num >> 24) & 077, ($num >> 18) & 077, ($num >> 12) & 077,
               ($num >> 6) & 077, $num & 077]);
}


@DigVals = (
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0,
       0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 11, 0, 0,
       0, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
       27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 0, 0, 0, 0, 10,
       0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
       53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 0
);

sub conv64tolong
{       local(@xnum) = split('', $_[0]);
       local($Answer) = 0;
       local($shift) = 6 * (@xnum - 1);

       for (@xnum)
       {       $Answer |= $DigVals[ord($_) - 040] << $shift;
               $shift -= 6;
       }

       $Answer;
}

1;

__END__


--

Rudy Maceyko <[email protected]>                     University of Pittsburgh/CIS