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)は、古い文字列を完全に返します。奇妙なことに、これらはエンコードされた文字列に値を追加しません。出力文字列から改行を削除すると、デコーダはそれを完全に再度デコードします。

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

回答:


223

編集:私が書いたのでBase64.strict_encode64()、この回答が追加されましたが、改行は追加されません。


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

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

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


44
私がこの回答を書いて以来、今のところstrict_encode64()見かけ上は改行を追加しないものがあるようです。
ChristofferHammarström

15
ばかげた!なぜあなたは私にこれをするのですか、ルビー?
ジョシュM.

1
これはデフォルトの設定ですが、@ChristofferHammarströmが言及しているように、本当のb64エンコーディングを取得する方法があります。
Dan

1
どうやらこれは、長い回線を処理できないソフトウェアとの後方互換性を維持するために存在します。stackoverflow.com/a/20065991/5749914
好戦的なチンパンジー2017

115

ruby-1.9.2にはBase64.strict_encode64があり、最後に\ n(改行)を追加しません。


それははるかに簡単な解決策です!
アビシャイ2013

Base64.strict_encode64が3文字の文字列を適切にエンコードされていないことを確認しました。Base64.strict_encode64( 'abc')-> YWJjのように。上記の例は正しくエンコードされていません。
CodeMaker

9

ええ、これはかなり正常です。このドキュメントは、行分割を示す例を示しています。base64は他の言語(Pythonなど)でも同じことを行います。

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


1
これはちょうど私のAndroidアプリ(JavaのBase64ライブラリ)で起こりました。私はこの奇妙な出来事に完全に混乱しました。文字通り1時間かけて何が問題だったかを突き止め、エラーを検索しました。このコメントは、6年経ってもレガシー問題を理解するのに役立ちます。
burglarhobbit



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.