BASE32デコード

BASE32 (cf. http://en.wikipedia.org/wiki/Base32) という謎エンコードの文字列をデコードする必要があったけど、ネットで探しても変に複雑なコードしかなかったので、自分で書きました。

public static class Base32 {

/// base32hexエンコーディングのBASE32文字列をデコードします。
public static byte[] FromBase32HexString(string str) {
// パディングを除いた文字列長を求める。
int len = str.Length - 1;
while(len >= 0 && str[len] != '=') {
--len;
}
++len;
// 結果バッファを生成する。
var buf = new byte[len * 5 / 8];
// 各文字の5ビットを結果バッファに設定する。
for(var i = 0; i < len; ++i) {
var value = FromBase32HexChar(str[i]);
var x = (i * 5) / 8; // 第一バイトの位置
var y = (i * 5) % 8; // 第一バイトにおけるビットオフセット
// 第一バイトを設定する。
buf[x + 0] |= (byte)(value << y);
// 第二バイトが区間外でなければ、設定する。
if(x + 1 < buf.Length) {
buf[x + 1] |= (byte)(value >> (8 - y));
}
}
// 結果を返す。
return buf;
}

/// BASE32エンコーディングの一種であるbase32hex文字から数値を得ます。
private static int FromBase32HexChar(char ch) {
if(ch <= '9') {
return ch - '0';
}
else if('A' <= ch && ch <= 'V') {
return ch - 'A' + 10;
}
else if('a' <= ch && ch <= 'v') {
return ch - 'a' + 10;
}
else {
throw new FormatException();
}
}

}

Wikipediaによれば、BASE32には特殊な文字マッピングを使うエンコード(RFC4648)と、自然な文字マッピングを使うエンコード (RFC2938) があるそうで、上のコードはRFC2938版です。

上記のコードは、法人/個人、有償/無償を問わずご自由に利用していただいてかまいませんが、著作者(私)はコードの利用に関する一切の結果から免責されるものとします。このコードは医療機器など、クリティカルな製品・動作に向けて書かれたものではありません。また、このコードの著作権を主張することは法律上できません。著作者・ライセンスを表示しなくていいですが、匿名でも本ブログにコメントを残していただけると本人的に有り難いです。