奇怪的\ n在base64编码的string在Ruby中

Ruby中embedded的Base64库增加了一些“\ n”。 我无法找出原因。 对于这个特殊的例子:

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" 

\ n在最后和第六位。 解码器(Base64.decode64)完美地返回旧的string。 奇怪的是,这些\ n不会给编码的string添加任何值。 当我从输出string中删除换行符时,解码器再次完全解码。

 irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str => true 

更多的是,我用另一个JS库来生成相同的inputstring的base64编码的输出,输出没有\ n的。

这是一个错误还是其他什么? 有没有人遇到过这个问题?

仅供参考,

 $ ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] 

编辑:因为我写这个答案Base64.strict_encode64()被添加,它不会添加换行符。


文档有些混乱, b64encode方法应该为每60个字符添加一个换行符,而encode64方法的例子实际上是使用b64encode方法。

似乎encode64使用的Array类的pack("m")方法也添加了换行符。 我会认为这是一个devise错误,这是不是可选的。

你可以自己删除换行符,或者如果你使用的是rails,那么就有了ActiveStack :: CoreExtensions :: Base64 :: Encoding和encode64s方法。

在ruby-1.9.2中你有Base64.strict_encode64,最后没有添加\ n(换行符)。

是的,这很正常。 该文件给出了一个例子来说明线分裂。 base64在其他语言也做同样的事情(例如Python)。

在编码阶段添加无内容换行符的原因是因为base64最初被devise为用于在电子邮件中发送二进制内容的编码机制,其中行长度是有限的。 如果您不需要它们,请随时更换。

似乎他们必须被剥夺/忽略,如:

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

使用Base64#encode64时添加\n是正确的,请查看这篇文章: https : Base64#encode64