[ILUG] Re: un-argh...
JD Paul
jdpaul at interstel.net
Sat Feb 2 16:42:51 GMT 2002
Hey Kevin,
It looks like you've reinvented the uuencoding algorithm. (See
http://www.opengroup.org/onlinepubs/7908799/xcu/uuencode.html for a
man page, assuming your local uuencode(1) man page doesn't include the
algorithm.)
Fortunately for your efficiency and fugliness concerns, Perl's pack() and
unpack() already do uuencoding:
$encoded = pack("u*", $s);
$decoded = unpack("u*", $encoded);
if ( $decoded ne $s ) { die "oops!\n"; }
Note the pack/unpack functions simply pass through trailing newlines
(embedded newlines are converted). This strikes me as very odd --
it makes it hard to emulate the uuencode/uudecode binaries' behavior
-- but at least they're consistent within Perl.
JD
On Fri, 1 Feb 2002, kevin lyda wrote:
> ok, earlier i posted a question on encoding a string. i found an answer.
> the goal was to take a string, break it into 6 bit chunks, add 32 to each
> chunk, then spew out the resulting string. the main characteristic of
> the resulting string is that it would be printable ascii - ascii 32 to 96.
>
> the solution i came up with is just plain fugly in my opinion, but it
> works and i've spent too much time on this one section of code, so i'm
> sticking with it. however if someone's bored they can fiddle it to make
> it pretty. :)
>
> thanks for all the replies!
>
> #!/usr/bin/perl
>
> sub encode_string {
> my($s) = @_;
>
> my($encoded, $x, $chunk);
> $encoded = "";
> while (length($s) > 0) {
> $chunk = unpack("b24", $s);
> $s = substr($s, 3);
> foreach $x (1...4){
> $encoded .= chr(ord(pack("b6", $chunk)) + 32);
> $chunk = substr($chunk, 6);
> }
> }
> return $encoded;
> }
>
> sub decode_string {
> my($e) = @_;
>
> my($decoded, $x, $chunk, $tchunk);
> $decoded = "";
> while (length($e) > 0) {
> $chunk = unpack("b32", $e);
> $e = substr($e, 4);
> $tchunk = "";
> foreach $x (1...4){
> $tchunk .= unpack("b6", chr(ord(pack("b8", $chunk)) - 32));
> $chunk = substr($chunk, 8);
> }
> $decoded .= pack("b24", $tchunk);
> }
> return $decoded;
> }
>
> $s = shift;
> $s = "\0\0\0AAA".chr(255).chr(255).chr(255)."BBBabcdef";
> $s .= "\0" x ((length($s) % 3)? 3 - (length($s) % 3): 0);
> $e = &encode_string($s);
> $d = &decode_string($e);
>
> print("original: '$s' (".length($s).")\n".
> "encoded: '$e'\n".
> "decoded: '$d' (".length($d).")\n");
>
> kevin
>
> --
> kevin at suberic.net buffy: come on, can't you put your foot down?!
> fork()'ed on 37058400 giles: it *is* down.
> meatspace place: orbit buffy: one of these days you're going to have to
> http://suberic.net/~kevin get a grown up car. --inca mummy girl
>
More information about the ILUG
mailing list