上京エンジニアの葛藤

都会に染まる日々

Base64 Encode を Ruby で再実装する

最近業務でよく Base64 に変換をしているが、A–Z, a–z, 0–9, +, / の文字列に変換されるという程度の知識しかなかった。

良い機会なので、もう少し踏み込んでアルゴリズムを自分で実装して理解を深めていこうと思う。

Base64 とは

データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式である
Base64 - Wikipedia

概ね自分の理解は間違っていないようだ。
RFCこちら

アルゴリズム

  1. 変換対象のデータを 6bit ずつ分割し、6bit に満たなかった場合は 0 でパディングする
  2. そして、分割した 6bit の値を変換表を用いて4文字で分割する
    この時4文字に満たなかった場合 = でパディングする

アルゴリズム自体は簡単である。

ちなみに Ruby では標準ライブラリを使うとこんな風に書ける。

require "base64"
puts Base64.strict_encode64("ABCDEFG") # => "QUJDREVGRw=="

strict_encode64 の場合、実装は pack("m0") を呼んでおり、改行コードを入れないような仕様になっている。

github.com

再実装

早速 Ruby で再実装してみる。

変換対象のデータを 6bit に分割するのが面倒だったので unpack を使うことで楽に書くことができた。
decode は encode の逆を行うとできる。
また時間があったら書いてみたい。

github.com