Base64 packing question

I'm packing up a file into an e-mail attachment using base64 encoding
and I'm only getting the first line of the file. I've discovered that
it's a misunderstanding I have about the pack method:

irb(main):001:0> ["a", "b", "c"].pack("m").unpack("m")
=> ["a"]

How do I get the whole array packed?

Quoteing sandspace@gmail.com, on Sat, Dec 04, 2004 at 08:36:11AM +0900:

I'm packing up a file into an e-mail attachment using base64 encoding
and I'm only getting the first line of the file. I've discovered that
it's a misunderstanding I have about the pack method:

irb(main):001:0> ["a", "b", "c"].pack("m").unpack("m")
=> ["a"]

How do I get the whole array packed?

Not sure why you think that pack wil concatenate the array before
base64ing it. Check out lib/base64.rb in the ruby lib directory for
an example of base64 encoding/decoding.

Sam

The Array in Array#pack is like a C struct, and the argument to pack is the format string to pack the Array into, so ["a", "b", "c"].pack "m" only packs one of the strings you provided.

You certainly don't want to pack the strings individually (["a", "b", "c"].pack "mmm"), instead you simply need to join the Array before packing:

body = ["a", "b", "c"].join("\n")

[body].pack("m")

···

On 03 Dec 2004, at 15:36, John Sands wrote:

I'm packing up a file into an e-mail attachment using base64 encoding
and I'm only getting the first line of the file. I've discovered that
it's a misunderstanding I have about the pack method:

irb(main):001:0> ["a", "b", "c"].pack("m").unpack("m")
=> ["a"]

How do I get the whole array packed?

Thanks. It works now.

I did it that way because The Ruby Way (page 92) has "the easiest way
to do a base64 encode/decode is the use the built-in features of Ruby.
The Array class has a pack method..." and it doesn't mention the
base64 class; so I didn't look for one.

Thanks.

···

On Sat, 4 Dec 2004 09:27:17 +0900, Sam Roberts <sroberts@uniserve.com> wrote:

Quoteing sandspace@gmail.com, on Sat, Dec 04, 2004 at 08:36:11AM +0900:

> I'm packing up a file into an e-mail attachment using base64 encoding
> and I'm only getting the first line of the file. I've discovered that
> it's a misunderstanding I have about the pack method:
>
> irb(main):001:0> ["a", "b", "c"].pack("m").unpack("m")
> => ["a"]
>
> How do I get the whole array packed?

Not sure why you think that pack wil concatenate the array before
base64ing it. Check out lib/base64.rb in the ruby lib directory for
an example of base64 encoding/decoding.

Sam

Quoteing sandspace@gmail.com, on Sat, Dec 04, 2004 at 10:04:55AM +0900:

Thanks. It works now.

I did it that way because The Ruby Way (page 92) has "the easiest way
to do a base64 encode/decode is the use the built-in features of Ruby.
The Array class has a pack method..." and it doesn't mention the
base64 class; so I didn't look for one.

Its got good advice, thats an odd-ball header, and I wouldn't actually
use it, but it saved me typing example code...

Cheers,
Sam