Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

How to generate 64-character length lines in base64?

by rmichael (Initiate)
on Mar 19, 2013 at 13:30 UTC ( #1024293=perlquestion: print w/ replies, xml ) Need Help??
rmichael has asked for the wisdom of the Perl Monks concerning the following question:

Perl's MIME::Base64::encode() generates 76-character lines. I would like to generate 64-character lines (PEM format base64). The encode method does not have a line length parameter.

It appears I could use Convert::PEM to specifically generate PEM content, although in that case, I need to investigate ASN.1 descriptions too.

I don't have much history with Perl, so before I dive in I wanted to ask for suggestions. Thank you!

Comment on How to generate 64-character length lines in base64?
Select or Download Code
Replies are listed 'Best First'.
Re: How to generate 64-character length lines in base64?
by thundergnat (Deacon) on Mar 19, 2013 at 13:45 UTC

    Specify a blank eol character when you encode it, then break it up however you want.

    Update: oops, removed bogus double quotes

    use MIME::Base64; my $str = 'Whatever'; my $encoded = encode_base64($str, ''); $encoded =~ s/(.{1,64})/$1\n/g; print $encoded;

      Thank you!

      I did wonder about this, but was unsure about '=' padding if/when required. encode with the default EOL would handle that for me, I believe. Perhaps breaking it up myself could necessitate change some line endings?

      I'll read a few more spec details and play with this.

Re: How to generate 64-character length lines in base64?
by kschwab (Priest) on Mar 19, 2013 at 21:30 UTC
    MIME::Base64 is a very small module, and the encode method is particularly small, since pack() does most of the work. They use pack to create a uuencoded string, then tr// to translate from the uuencode charset to the Base64 charset: Copying the source, then, with a few minor modifications
    sub b6464 { my $orig=shift; my $string = pack("u",$orig); $string =~ s/^.//mg; $string =~ s/\n//g; # use tr to translate from UUE to Base64 $string =~ tr|` -_|AA-Za-z0-9+/|; # fix padding at the end my $padding = (3 - length($orig) % 3) % 3; $string =~ s/.{$padding}$/'=' x $padding/e if $padding; # break string into lines of 64 chars or less $string =~ s/(.{1,64})/$1\n/g; return $string; }

      I've got a bit of time now, and am looking at this again.

      Thank you for your help!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1024293]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (12)
As of 2015-07-07 22:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls