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: rm55+@pitt.edu (Rudolph T Maceyko)
Newsgroups: comp.lang.perl
Subject: Re: Base 64?
Message-ID: <5590@blue.cis.pitt.edu>
Date: 1 Nov 93 09:00:45 GMT
References: <uglykidCFrvtp.11z@netcom.com>
Sender: news+@pitt.edu
Organization: University of Pittsburgh
Lines: 83

In article <uglykidCFrvtp.11z@netcom.com> uglykid@netcom.com (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 <rm55+@pitt.edu>                     University of Pittsburgh/CIS


