Ruby中base64编码字符串中的\ n奇怪


159

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]

同样的奇怪问题
Nadav B

Answers:


223

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


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

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

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


44
似乎自从我写了这个答案以来,现在strict_encode64()表面上并没有添加换行符。
ChristofferHammarström,

15
如此愚蠢!露比,为什么要对我这样做?
乔什M.

1
这是默认的assinie,但是正如@ChristofferHammarström提到的那样,现在有一种方法可以获取真正的b64编码。
2015年

1
显然,这是为了与无法处理长行的软件保持向后兼容。stackoverflow.com/a/20065991/5749914
好战的黑猩猩

115

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


这是一个简单得多的解决方案!
Avishai

我检查了Base64.strict_encode64是否正确编码了三个字符串。就像Base64.strict_encode64('abc')-> YWJj一样。上面的示例编码不正确。
CodeMaker

9

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

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


1
这只是在我的Android应用(Java的Base64库)中发生的。我完全被这种奇怪的事情弄糊涂了。从字面上看,我花了1个小时找出问题所在,然后搜索错误。即使在6年后,此评论也有助于理解遗留问题。
burglarhobbit



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.