web-dev-qa-db-ja.com

Rubyのbase64エンコード文字列の奇妙な\ n

Rubyの組み込みBase64ライブラリは、いくつかの '\ n'sを追加しています。理由を見つけることができません。この特別な例では:

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]
140
intellidiot

Edit:この答えを書いたので Base64.strict_encode64() が追加されましたが、改行は追加されません。


ドキュメント はやや混乱します。b64encodeメソッドは60文字ごとに改行を追加することになっており、encode64メソッドの例は実際にb64encodeメソッドを使用しています。

encode64が使用するArrayクラスのpack("m")メソッドも改行を追加するようです。これはオプションではないことが設計上のバグだと思います。

改行を自分で削除するか、Railsを使用している場合は、 ActiveSupport :: CoreExtensions :: Base64 :: Encodingencode64sメソッドがあります。

Ruby-1.9.2にはBase64.strict_encode64があり、末尾に\ n(改行)は追加されません。

107
ghtn

ええ、これは非常に正常です。 doc は、行分割を示す例を示しています。 base64は他の言語(Pythonなど)でも同じことを行います。

エンコード段階でコンテンツなしの改行が追加される理由は、base64が元々、電子メールでバイナリコンテンツを送信するためのエンコードメカニズムとして考案されたためです。不要な場合は遠慮なく交換してください。

9
bobince

次のように、それらは削除/無視される必要があるようです。

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

\n使用時に追加Base64#encode64は正しいです。この投稿をチェックしてください: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-Ruby/

2
user1519240

つかいます strict_encode64 方法。 encode64は、60個のシンボルごとに\ nを追加します