177

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

6 に答える 6

261

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


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

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

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

于 2010-04-12T09:38:42.673 に答える
118

ruby-1.9.2 では、末尾に \n (改行) を追加しない Base64.strict_encode64 があります。

于 2011-01-13T12:32:41.863 に答える
9

ええ、これはごく普通のことです。ドキュメントは、行分割を示す例を示しています。base64 は、他の言語でも同じことを行います (例: Python)。

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

于 2010-04-12T09:43:06.010 に答える
6

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

Base64.encode64(str).gsub(/\n/, '')
于 2013-02-22T15:28:51.980 に答える