# Encoding/decoding a image as Base64 (fails under Ruby1.9 but works under Ruby1.8)

**URL:** <https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753>\
**Category:** Ruby\
**Created:** [December 3, 2009, 1:23am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753 "2009-12-03T01:23:19Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 1:23am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/1 "2009-12-03T01:23:19Z")

</div>

Hi, the folowing code encodes and decodes a image file as Base64:

- Encode “icon.png” in Base64 as “base64.txt”:

* * *

## File.open(“base64.txt”,“w”) do |file| file.write [open(“icon.png”).read].pack(“m”) end

- Decode “base64.txt” as a PNG “new\_icon.png” file:

* * *

## File.open(‘new\_icon.png’, ‘wb’) do |file| file \<\< (IO.readlines(‘base64.txt’).to\_s.unpack(‘m’)).first end

It works perfectly under Ruby1.8 (after encoding and decoding “icon.png”  
is  
exatcly the same as “new\_icon.png”, the same binay file).

However running under Ruby1.9 the result is different since  
“new\_icon.png” is  
a corrupted image file. When I try to open it with a image viewer I get  
this  
error (under Linux):

libpng warning: gAMA: CRC error  
libpng error: PNG unsigned integer out of range.

Which is the difference when using Ruby1.9? how to solve it?  
Thanks a lot.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 1:25am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/2 "2009-12-03T01:25:39Z")

</div>

El Jueves, 3 de Diciembre de 2009, IÃ±aki Baz C. escribiÃ³:

> * * *
> 
> is a corrupted image file. When I try to open it with a image viewer I get  
> this error (under Linux):
> 
> libpng warning: gAMA: CRC error  
> libpng error: PNG unsigned integer out of range.
> 
> Which is the difference when using Ruby1.9? how to solve it?  
> Thanks a lot.

The difference is in the second step, the decoding process, since  
“base64.txt”  
file is the same using Ruby1.8 or 1.9.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 1:30am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/3 "2009-12-03T01:30:55Z")

</div>

El Jueves, 3 de Diciembre de 2009, IÃ±aki Baz C. escribiÃ³:

> The difference is in the second step, the decoding process, since  
> “base64.txt” file is the same using Ruby1.8 or 1.9.

Ok, the issue is fixed by uing “IO.read” rather than “IO.readlines”:

- Decode “base64.txt” as a PNG “new\_icon.png” file:

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 9:04am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/4 "2009-12-03T09:04:29Z")

</div>

On Thu, Dec 3, 2009 at 1:22 AM, Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> File.open(“base64.txt”,“w”) do |file|  
> file.write [open(“icon.png”).read].pack(“m”)  
> end
> 
> File.open(‘new\_icon.png’, ‘wb’) do |file|  
> file \<\< (IO.readlines(‘base64.txt’).to\_s.unpack(‘m’)).first  
> end
> 
> Which is the difference when using Ruby1.9? how to solve it?  
> Thanks a lot.

In Ruby 1.9, Array#to\_s is an alias for Array#inspect.

In Ruby 1.8, Array#to\_s worked like Array#join with no arguments.

Try this:  
IO.read “base64.txt”

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 9:18am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/5 "2009-12-03T09:18:32Z")

</div>

2009/12/3 Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> * * *
> 
> a corrupted image file. When I try to open it with a image viewer I get this  
> error (under Linux):
> 
> libpng warning: gAMA: CRC error  
> libpng error: PNG unsigned integer out of range.
> 
> Which is the difference when using Ruby1.9? how to solve it?  
> Thanks a lot.

One thing strikes odd: you are not reading the file in binary mode.  
It may be that 1.9 punishes you for that. You probably rather want

File.open(“base64.txt”,“w”) do |file|  
file.write [File.open(“icon.png”, “rb”) {|io| io.read}].pack(“m”)  
end

You can simplify decoding as

File.open(‘new\_icon.png’, ‘wb’) do |file|  
file.write(File.read(‘base64.txt’).unpack(‘m’).first)  
end

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 10:44am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/6 "2009-12-03T10:44:34Z")

</div>

El Jueves, 3 de Diciembre de 2009, Robert K.  
escribió:\> \> - Decode “base64.txt” as a PNG “new\_icon.png” file:

> > However running under Ruby1.9 the result is different since  
> > One thing strikes odd: you are not reading the file in binary mode.  
> > end  
> > That makes lot of sense!  
> > Thanks.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 11:42am UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/7 "2009-12-03T11:42:30Z")

</div>

El Jueves, 3 de Diciembre de 2009, Lars C.  
escribió:\> \> Thanks a lot.

> In Ruby 1.9, Array#to\_s is an alias for Array#inspect.
> 
> In Ruby 1.8, Array#to\_s worked like Array#join with no arguments.
> 
> Try this:  
> IO.read “base64.txt”

Yes. It seems that usng “to\_s” could be a bit problematic under Ruby1.9  
due to  
the new behaviour…  
Thanks.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [December 3, 2009, 1:13pm UTC](https://www.ruby-forum.com/t/encoding-decoding-a-image-as-base64-fails-under-ruby1-9-but-works-under-ruby1-8/179753/8 "2009-12-03T13:13:13Z")

</div>

On Thu, Dec 3, 2009 at 5:01 AM, Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> El Jueves, 3 de Diciembre de 2009, Lars C. escribió:
> 
> > On Thu, Dec 3, 2009 at 1:22 AM, Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:  
> > In Ruby 1.9, Array#to\_s is an alias for Array#inspect.
> > 
> > In Ruby 1.8, Array#to\_s worked like Array#join with no arguments.
> 
> Yes. It seems that usng “to\_s” could be a bit problematic under Ruby1.9 due to  
> the new behaviour…

[http://talklikeaduck.denhaven2.com/2009/10/27/its-the-little-things](http://talklikeaduck.denhaven2.com/2009/10/27/its-the-little-things)

–  
Rick DeNatale

Blog: [http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [http://www.workingwithrails.com/person/9021-rick-denatale](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)
