1. ホーム
  2. ruby

[解決済み] Rubyでbase64エンコードされた文字列の中にある不思議な "view"。

2022-04-21 14:15:25

質問

Rubyに内蔵されているBase64ライブラリに'˶'ᴗ'˶が追加されます。その原因がわかりません。この特殊な例では

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"

を、最後と最後から6番目の位置に配置しました。デコーダ(Base64.decode64)は完全に古い文字列を返します。不思議なことに、これらの "second "はエンコードされた文字列には何の価値も与えません。また、出力された文字列から改行を取り除くと、デコーダは再び完全にそれをデコードします。

irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true

さらに、別のJSライブラリを使って、同じ入力文字列をbase64でエンコードした出力を生成してみました。

これはバグか何かでしょうか?どなたかこの問題に直面したことがある方はいらっしゃいますか?

ご参考までに。

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

解決方法は?

編集する。 この回答を書いてから Base64.strict_encode64() が追加されましたが、これは改行を追加しないものです。


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

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

自分で改行を削除するか、railsを使っているのであれば ActiveSupport::CoreExtensions::Base64::Encoding と共に encode64s メソッドを使用します。