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

int*_*iot 146 ruby base64 encode

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"
Run Code Online (Sandbox Code Playgroud)

\n是从结尾开始的最后一个位置和第六个位置.解码器(Base64.decode64)完美地返回旧字符串.奇怪的是,这些\n不会为编码字符串添加任何值.当我从输出字符串中删除换行符时,解码器会再次完美地对其进行解码.

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

更多的是,我使用另一个JS库来生成相同输入字符串的base64编码输出,输出没有\n的.

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

仅供参考,

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Run Code Online (Sandbox Code Playgroud)

Chr*_*röm 197

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


文档有点令人困惑,该b64encode方法应该为每60个字符添加一个换行符,该encode64方法的示例实际上是使用该b64encode方法.

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

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

  • 似乎自从我写这个答案后,现在有`strict_encode64()`,表面上看不会添加换行符. (42认同)
  • 如此愚蠢!为什么你这样对我,Ruby? (14认同)
  • 这是在杀我!浪费了一个小时没有充分的理由! (2认同)
  • 这是一个默认设置,但正如 @ChristofferHammarström 提到的,现在有一种方法可以获得真正的 b64 编码。 (2认同)

ght*_*htn 111

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


bob*_*nce 9

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

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


mee*_*ern 6

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

Base64.encode64(str).gsub(/\n/, '')
Run Code Online (Sandbox Code Playgroud)


小智 6

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