177

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 位于从末尾算起的最后一个和第 6 个位置。解码器 (Base64.decode64) 完美地返回旧字符串。奇怪的是,这些 \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]
4

6 回答 6

261

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


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

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

您可以自己删除换行符,或者如果您使用的是 rails,则可以使用ActiveSupport ::CoreExtensions::Base64::Encodingencode64s方法。

于 2010-04-12T09:38:42.673 回答
118

在 ruby​​-1.9.2 中,您有 Base64.strict_encode64 ,它不会在末尾添加 \n (换行符)。

于 2011-01-13T12:32:41.863 回答
9

是的,这很正常。该文档给出了一个演示分行的示例。base64 在其他语言中也做同样的事情(例如 Python)。

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

于 2010-04-12T09:43:06.010 回答
8

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

于 2018-02-01T13:19:09.113 回答
6

似乎它们必须被剥离/忽略,例如:

Base64.encode64(str).gsub(/\n/, '')
于 2013-02-22T15:28:51.980 回答
2

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

于 2015-10-29T12:10:20.320 回答