著作一覧 |
copy java\util\prefs\Base64.java Base64.javaしてからパッケージ名変えるというんじゃだめなのかなぁ。 というか、Base64がオフィシャルに無いということはどういうことかと言うと、
なんだかなー感が漂うね。
僕はルックアップテーブルを使ったprefsの実装が好きかな。
RFC2045準拠度だと多分、security.utilsが固そうな気がする(xercesの実装を元にしたOptimized codeだとコメントしてるし)。
ちなみにprefsのはジョシュアブロックの実装と@authorに書いてある。
ジョシュアブロックといえば
Java Puzzlers 罠、落とし穴、コーナーケース(ジョシュア・ブロック)
こういうのも書いているしJavaOneでもやってるみたいだけど、僕が読んだのは幾つかのソースコードと、
Effective Java™ Programming Language Guide (Java Series)(Bloch, Joshua)
これ。
Effective Javaな人はルックアップテーブルを使うのであった。
int result = 0; for (char ch : "08Ab5") { result *= 16; if (Character.isDigit(ch)) { result += ch - '0'; } else if (Character.isLowerCase(ch)) { result += ch - 'a' + 10; } else if (Character.isUpperCase(ch)) { result += ch - 'A' + 10; } else { throw new IllegalArgumentException("bad character: " + ch + " in given string"); } } return result;多分、最適化すると
int result = 0; for (char ch : "08Ab5") { result *= 16; if (ch >= '0' && ch <= '9') { result += ch - '0'; } else if (ch >= 'A' && ch <= 'F') { result += ch - 'A' + 10; } else if (ch >= 'a' && ch <= 'f') { result += ch - 'a' + 10; } else { throw new IllegalArgumentException("bad character: " + ch + " in given string"); } }となる。
static final int[] lookuptable = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, }; int result = 0; for (char ch : "08Ab5") { result *= 16; if (lookuptable[ch] < 0) { // maybe thrown IndexOutOfBoundsException throw new IllegalArgumentException("bad character: " + ch + " in given string"); } result += lookuptable[ch]; }となる。
ルックアップテーブルを参照する方法はロジックがコードからテーブルに移動するため、一般的にはメンテナンスがしやすく、しかも高速になりえる(ルックアップテーブルってドメインモデルみたいだな)。
追記:文字列に拡張forは適用できないのか。残念。
上のforは、for (int i = 0; i < "08Ab5".length(); i++) { char ch = "08Ab5".charAt(i);
と書いたものとしておこう。
さらに追記:leajistさんのツッコミが正しいですね、この場合。for (char ch : "08Ab5".toCharArray()) {
ということで。
ジェズイットを見習え |
java.util.prefsの中にBase64なんてあったんですね。でもパッケージプライベートだから、使えない... publicにして欲しいですね。私は普段はJavaMailの中のBase64を使用しています。
他のcommonsとセットで、common-codec。
for (char ch : "08Ab5".toCharArray()) {<br>でいけますよ〜
そのてがあったか。