Ruby
base64
エンコード

【Ruby】Base64エンコードまとめ

WebAPIにPOSTリクエストを投げることが目的で、実装をしている際、
base64でエンコードをする所で詰まっていたので調べたまとめを残しておきます。

目次

■base64とは何か
■各メソッドの違い
■まとめ
■参考資料

base64とは何か

データをアルファベット(a~z, A~z),数字(0~9),一部の記号(+,/)の64文字で表すエンコード方式
ただ、データ長を揃えるためにパディングとして末尾に記号の=を使用するため、
実際はbase64は、65文字の英数字から表現されている

ちなみに、エンコードとは?
人がデータを見るときは、分かりやすいように文字や記号で表示されていますが、
実際、コンピュータは数で処理を行っており、各文字、記号に対応した数値が存在しています。
エンコード(方式)とはどの文字がどのビット列に割り当てるのかを決めることを指します。

つまり、base64でエンコードするというのは、
文字や記号といったあらゆるデータをそれの対応した数値で表すこと/マッピングすることです。

各メソッドの違い

実際に、rubyでbase64エンコードをする手段としてどんなものがあるのか?
今回は、下記3つを比べてみました。
ちなみに今回WebAPIにPOSTリクエストを投げる際に、躓いたのは改行の有無です。なかなか気づくことができませんでしたw

Base64.encode64()
# 与えられたデータを Base64 エンコードした文字列を返す。エンコード後の文字で 60 文字ごとに改行を追加する
Base64.urlsafe_encode64()
# 与えられたデータを Base64 エンコードした文字列を返す。 "+" を "-" に "/" を "_" に置き換える
Base64.strict_encode64()
# 与えられたデータを Base64 エンコードした文字列を返す。改行コードを追加しない

それぞれの出力結果を見ていきます。(メソッド名をそれぞれのファイル名にしています。)
エンコードしているデータ自体に特に意味はありません。

encode64.rb
require 'base64'

data = {
  name: "test",
  keys: { keys_test: 1234},
  values: { values_test: 122345678 }
}.to_s
test_data = "Test/encode data" + "data is" + data
encoding_data = Base64.encode64(test_data)
puts encoding_data

# 出力結果
VGVzdC9lbmNvZGUgZGF0YWRhdGEgaXN7Om5hbWU9PiJ0ZXN0IiwgOmtleXM9
Pns6a2V5c190ZXN0PT4xMjM0fSwgOnZhbHVlcz0+ezp2YWx1ZXNfdGVzdD0+
MTIyMzQ1Njc4fX0=
#改行が入ってる
encode64.rb
require 'base64'

data = {
  name: "test",
  keys: { keys_test: 1234},
  values: { values_test: 122345678 }
}.to_s
test_data = "Test/encode data" + "data is" + data
encoding_data = Base64.urlsafe_encode64(test_data)
puts encoding_data

# 出力結果
VGVzdC9lbmNvZGUgZGF0YWRhdGEgaXN7Om5hbWU9PiJ0ZXN0IiwgOmtleXM9Pns6a2V5c190ZXN0PT4xMjM0fSwgOnZhbHVlcz0-ezp2YWx1ZXNfdGVzdD0-MTIyMzQ1Njc4fX0=
# 今回の場合、+の部分が-に変わっている
encode64.rb
require 'base64'

data = {
  name: "test",
  keys: { keys_test: 1234},
  values: { values_test: 122345678 }
}.to_s
test_data = "Test/encode data" + "data is" + data
encoding_data = Base64.strict_encode64(test_data)
puts encoding_data

# 出力結果
VGVzdC9lbmNvZGUgZGF0YWRhdGEgaXN7Om5hbWU9PiJ0ZXN0IiwgOmtleXM9Pns6a2V5c190ZXN0PT4xMjM0fSwgOnZhbHVlcz0+ezp2YWx1ZXNfdGVzdD0+MTIyMzQ1Njc4fX0=
# 改行がされていない

まとめ

■エンコードとは、エンコード(方式)とはどの文字がどのビット列に割り当てるのかを決めること
■base64エンコードとは、データをアルファベット(a~z, A~z),数字(0~9),一部の記号(+,/)の64文字で表すエンコード方式
■Base64.encode64 => 与えられたデータを Base64 エンコードした文字列を返す。エンコード後の文字で 60 文字ごとに改行を追加する
■Base64.urlsafe_encode64 => 与えられたデータを Base64 エンコードした文字列を返す。 "+" を "-" に "/" を "_" に置き換える
■Base64.strict_encode64 => 与えられたデータを Base64 エンコードした文字列を返す。改行コードを追加しない

参考資料

文字コードとは?エンコードとは?なぜ文字化けするのか?
base64ってなんぞ??理解のために実装してみた
最速Rubyリファレンスマニュアル検索!
RubyでBase64URLエンコーディング