Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange \n in base64 encoded string in Ruby

People also ask

Can Base64 contain newline?

RFC 2045, which defined Base64, REQUIRES a newline after 76 characters (max). What makes you think your example is not the correct way? @MSalters RFC 4648 specifically addresses that issue.

What is b64 string?

Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation. The term Base64 originates from a specific MIME content transfer encoding.


Edit: Since I wrote this answer Base64.strict_encode64() was added, which does not add newlines.


The docs are somewhat confusing, the b64encode method is supposed to add a newline for every 60th character, and the example for the encode64 method is actually using the b64encode method.

It seems the pack("m") method for the Array class used by encode64 also adds the newlines. I would consider it a design bug that this is not optional.

You could either remove the newlines yourself, or if you're using rails, there's ActiveSupport::CoreExtensions::Base64::Encoding with the encode64s method.


In ruby-1.9.2 you have Base64.strict_encode64 which doesn't add that \n (newline) at the end.


Yeah, this is quite normal. The doc gives an example demonstrating the line-splitting. base64 does the same thing in other languages too (eg. Python).

The reason content-free newlines are added at the encode stage is because base64 was originally devised as an encoding mechanism for sending binary content in e-mail, where the line length is limited. Feel free to replace them away if you don't need them.


Seems they've got to be stripped/ignored, like:

Base64.encode64(str).gsub(/\n/, '')

Use strict_encode64 method. encode64 adds \n every 60 symbols


The \n added when using Base64#encode64 is correct, check this post out: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/