Question
The inbuilt Base64 library in Ruby is adding some '\n's. I'm unable to find out the reason. For this special example:
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'base64'
=> true
irb(main):003:0> str = "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
irb(main):004:0> Base64.encode64(str)
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n"
The \n's are at the last and 6th position from end. The decoder (Base64.decode64) returns back the old string perfectly. Strange thing is, these \n's don't add any value to the encoded string. When I remove the newlines from the output string, the decoder decodes it again perfectly.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
More of this, I used an another JS library to produce the base64 encoded output of the same input string, the output comes without the \n's.
Is this a bug or anything else? Has anybody faced this issue before?
FYI,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Answer
Edit: Since I wrote this answer
[Base64.strict_encode64()
](https://docs.ruby-
lang.org/en/3.0.0/Base64.html#method-i-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.