JavaでBase32のデコーダーを実装

今書いてるプログラムでBase32エンコードされた文字列をデコードをする必要があったんですが、Java標準ライブラリにそういうクラスは無く、Apache Commonsで提供されているみたいですが、練習を兼ねて車輪の再発明をしました。

エンコードの仕組みについてはこちらのサイトを参考にさせて頂きました。
base32 についてメモ
ここで書かれていることの逆を実装していきます。

作ったクラスのコードはこちら
https://github.com/yoshi-self/Base32Decoder/blob/master/com/yoshi_self/Base32Decoder.java

以下解説

Base32エンコードは40bit(5byte)単位で8文字に変換される

なので8文字単位でデコードしていき最後につなげます。

40bit(8byte)をデコード

40bitのBitSetを作成します

ABCDEFGHIJKLMNOPQRSTUVWXYZ234567の配列を作成しておき、1バイトごとに対応する数値を取ります。

この数値の下位5ビットをBitSetにセットします。

5byteのbyte[]を作り、BitSetと同じ並びにビットをセットします。(BitSet.toByteArray()を使うと順番がおかしくなります)

結果を返す

最初charsetとか考えず5の倍数バイト全部返してて、それじゃダメだと気づいて0のバイト捨てるように直したんですが、更に考えてみると、オリジナルの文字コードが何バイトで意味をもつかわからないので結局charsetを指定させる実装にしました。

っていうかこのブログのコード表示ブロックの記号がエスケープされたままになってる…WordPressが自動エスケープしたあとpreとかで出てるからだろうか…そのうち直します。。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする