はじめに
タイトルはちょっとウケ狙いなので、許してください。。
業務中に、Base64でエンコードして、デコードして、といった指示があり、初めて聞いた単語に「?」が浮かんだ。
ここでは、自分が調べた情報を共有して、自分のような0からスタートする人の助けになる記事を書きたいと思って書きました。
Base64とは
base64とは、64進数を意味する言葉です。
すべてのデータをアルファベット(a~z, A~z)と数字(0~9)、一部の記号(+,/)の64文字で表すエンコード方式のこと。
ただ、データ長を揃えるためにパディングとして末尾に記号の=を使用するので、厳密にはbase64は、65文字の英数字から表現されています。
エンコードの流れ
-
対象の文字列を 16 進数に変換する
-
16 進数に変換した数字をそれぞれ 2 進数に変換する
-
6 ビットごとに分割して、足りない部分は 0 で詰める
-
変換表にしたがって各 6 ビットをエンコードしていく
-
4文字ごとに分割して末尾が余る場合、"=" で詰める
-
最後にすべての文字をつなげて完成
※デコードは逆の流れ
ABCDEFG
↓
41 42 43 44 45 46 47
↓
0100 0001, 0100 0010, 0100 0011, 0100 0100, 0100 0101, 0100 0110, 0100 0111
↓
010000 010100 001001 000011 010001 000100 010101 000110 010001 11
↓
010000 010100 001001 000011 010001 000100 010101 000110 010001 110000
↓
QUJDREVGRw
↓
"QUJD", "REVG", "Rw"
↓
"QUJD", "REVG", "Rw=="
↓
QUJDREVGRw==
モジュール関数
decode64
与えられた文字列をBase64デコードしたデータで返します。
require 'base64'
str = 'Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4gUnVieQ=='
puts Base64.decode64(str)
# => "Now is the time for all good coders\nto learn Ruby"
encode64
与えられた文字列をBase64エンコードしたデータで返します。
require 'base64'
str = "Now is the time for all good coders\nto learn Ruby"
Base64.encode64(str)
# => Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4gUnVieQ==
おまけ
こちらのツールを使えば自動でエンコードした文字列を出力してくれるので、エンコード文字列が欲しい場合はこちらを使うのが便利です。
終わりに
ここまでで、0からの知識の人でもある程度は掴めたのではないでしょうか?
頻繁ではないにしろ、必要な知識ではあると思うので、使えるレベルまで持っていって損は無いです!
参考
[Base64のしくみを理解するためにRubyで実装してみる]
(https://note.com/sunakujira/n/ncecc0ac62589)
[module Base64]
(https://docs.ruby-lang.org/ja/latest/class/Base64.html)
[base64でエンコードされた画像をActive Storageで保存する]
(https://qiita.com/ozin/items/5ec81a4b126b8ebf7a96)
[Rails(Ruby)でBase64化された画像を取り回すときのSnippet]
(https://qiita.com/maruware/items/407fc668f06e7784b198)
[singleton method Tempfile.new]
(https://docs.ruby-lang.org/ja/latest/method/Tempfile/s/new.html)