【问题标题】:Strange \n in base64 encoded string in RubyRuby中base64编码字符串中的奇怪\ n
【发布时间】:2011-02-06 22:29:40
【问题描述】:

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]

【问题讨论】:

  • 这里有同样奇怪的问题

标签: ruby base64 encode


【解决方案1】:

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


The docs 有点混乱,b64encode 方法应该为每 60 个字符添加一个换行符,encode64 方法的示例实际上是使用b64encode 方法。

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

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

【讨论】:

  • 似乎自从我写了这个答案以来,现在有strict_encode64() 表面上不添加换行符。
  • 太笨了!露比,你为什么要这样对我?
  • 这是一个 assinie 默认值,但正如 @ChristofferHammarström 所提到的,现在有一种方法可以获得真正的 b64 编码。
  • 显然这是为了与无法处理长行的软件保持向后兼容。 stackoverflow.com/a/20065991/5749914
【解决方案2】:

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

【讨论】:

  • 这是一个更简单的解决方案!
  • 我检查了 Base64.strict_encode64 是不是正确编码的三个字符串。像 Base64.strict_encode64('abc') -> YWJj 。上面的例子没有正确编码。
  • @CodeMaker 我认为YWJj 是正确的。这有什么问题?
【解决方案3】:

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

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

【讨论】:

  • 这只是发生在我的 Android 应用程序(Java 的 Base64 库)中。我对这种奇怪的现象完全感到困惑。我花了 1 个小时才弄清楚出了什么问题,然后搜索了错误。即使在 6 年后,此评论也有助于理解遗留问题。
【解决方案4】:

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

【讨论】:

  • 我们可以将其更改为在 76 个符号之后添加吗?
【解决方案5】:

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

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

【讨论】:

  • 这个解决方案很脏.. 还有什么?
  • @yaauie (via suggested edit):通常不应进行进行重大更改的编辑。我建议将其作为单独的答案发布。
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多