首页 文章

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

提问于
浏览
122

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.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]

6 回答

  • 2

    Edit: 自从我写了这个答案后,添加了 Base64.strict_encode64() ,但没有添加换行符 .


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

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

    您可以自己删除换行符,也可以使用 encode64s 方法删除换行符're using rails, there' .

  • 9

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

  • 155

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

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

  • 0

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

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

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

  • 3

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

相关问题