Ruby 中 base64编码的字符串中的怪异 n

Ruby 中内置的 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.decde64)完美地返回旧字符串。奇怪的是,这些 n 没有给编码后的字符串增加任何值。当我从输出字符串中删除换行符时,解码器再次完美地解码它。

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

除此之外,我还使用了另一个 JS 库来生成相同输入字符串的 base64编码输出,输出中没有 n。

这是漏洞还是其他什么? 以前有人遇到过这个问题吗?

仅供参考,

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

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


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

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

您可以自己删除换行,或者如果使用 Rail,则使用 encode64s方法生成 ActiveSupport: : CoreExtended: : Base64: : Encoding

是的,这很正常。医生给出了一个演示分行的示例。Base64在其他语言中也做同样的事情(例如,。巨蟒)。

在编码阶段添加无内容换行符的原因是,base64最初是作为一种编码机制设计的,用于在电子邮件中发送二进制内容,其中行长度是有限的。如果你不需要,可以随时更换。

在 ruby-1.9.2中,Base64.stern _ encode64没有在末尾添加 n (换行符)。

看起来他们必须被剥离/忽略,比如:

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

当使用 Base64#encode64时添加的 \n是正确的,检查这篇文章: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/

使用 strict_encode64方法。 encode64每60个符号添加 n