ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

JavaにおけるBase64変換

2007-08-10 15:50:38 | JavaとWeb

 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

が、わかりやすかったです。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« オブジェクト指向で開発の最... | トップ | はてなダイアリーはブログ界... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事