JavaでBase64変換を行おうと思ったとき、(JavaMailとか、他のものでもできるのかもしれないけれど)ApacheのCommonsのcodecを使うと、ちょー簡単そうにみえたので、つかってみました(実際、ちょーかんたんだけど、注意点がある)
■ありかとインストール
そのありかは、ここ
Codec Home
http://commons.apache.org/codec/index.html
ここのはじにDownloadっていうのがあるので、そこからダウンロード。1.3のzipを落としてきました。
で、そいつを解凍して、commons-codec-1.3.jarを、パスに通します
(eclipseなら、そいつを使いたいプロジェクトをして右クリックしてPropertiesを選択、ダイアログを出したら、Java Build PathのLibrariesタブのAddExternal Jarsボタンをクリックしてcommons-codec-1.3.jarを選ぶ。ごめん、ウィリアムのいたずらのeclipseは、英語のまま使っているので、日本語用の人は、適宜読み替えてくださいませ)
JavaDocは、ここにあって、今回は、Base64クラスをつかいます。
■Base64から普通のファイルに(=デコード)
Base64から普通のファイルになおす、デコード処理は、
byte[] outdata = Base64.decodeBase64(indata);
でOK。この引数indataに、Base64形式で読み込んだデータをいれてね!
なので、base64.txtというファイルにBase64形式のデータが入っていて、
それをデコードした結果を、decode.txtに入れたい場合は、こんなかんじ
import java.io.*; import org.apache.commons.codec.binary.Base64; public class Test { public static void main(String[] args) { try { //==================================// //Base64エンコードファイルを読み込む// //==================================// File inf = new File("base64.txt"); FileInputStream fi = new FileInputStream(inf); byte[] indata = new byte[(int) inf.length()]; fi.read(indata); fi.close(); //==================================// // Base64デコード // //==================================// byte[] outdata = Base64.decodeBase64(indata); //==================================// // 結果書き出し // //==================================// File outf = new File("decode.txt"); FileOutputStream fo = new FileOutputStream(outf); fo.write(outdata); fo.close(); } catch (Exception e) { e.printStackTrace(); } } } |
(上記< > ¥ は、本当は半角です)
■Base64にする(エンコード)は、注意が必要
一方、Base64に変換する場合は、
byte[] outdata = Base64.encodeBase64(indata);
で、indataに、ふつうのファイルから読み込んだデータをいれると、
たしかにoutdataに変換結果を返してくれるんだけど、
76バイトで切ってくれるわけではない。
(Base64は、76バイトごとに切るのが、仕様だったと思った)
そこで、こんなかんじで行いました。
import java.io.*; import org.apache.commons.codec.binary.Base64; public class Test2 { public static void main(String[] args) { try { //==================================// // ファイルを読み込む // //==================================// File inf = new File("plain.txt"); FileInputStream fi = new FileInputStream(inf); byte[] indata = new byte[(int) inf.length()]; fi.read(indata); fi.close(); //==================================// // Base64エンコード // //==================================// byte[] outdata = Base64.encodeBase64(indata); //==================================// // 結果書き出し // //==================================// File outf = new File("encode.txt"); FileOutputStream fo = new FileOutputStream(outf); byte[] oneRec = new byte[78]; for(int i = 0 ; i <= outdata.length ; i ++ ) { // データ書き出し if ( i % 76 == 0 ) { if ( i != 0 ) { oneRec[76] = '¥r'; oneRec[77] = '¥n'; fo.write(oneRec); } } else if ( i == outdata.length ) { oneRec[i%76] = '¥r'; oneRec[i%76+1] = '¥n'; fo.write(oneRec,0,i%76+2); } if ( i < outdata.length ) { oneRec[ i % 76 ] = outdata[i]; } } fo.close(); } catch (Exception e) { e.printStackTrace(); } } } |
(上記< > ¥ は、本当は半角です)
とはいえ、簡単に出来たりします。
ちなみに、VC++のBase64変換についてや、Base64のしくみについては、
ここ http://www5b.biglobe.ne.jp/~kouta_y/c/c04.html
が、わかりやすかったです。