スポンサーリンク

バッチで,BASE64のエンコード+デコードする方法 (WSH/JScriptで,バイナリのファイルをテキスト符号化)


BASE64を使えば,バイナリのファイルをテキストデータ(英数字)に変換できる。

もちろん,元のファイルに戻す事もできる。


だから,

  • 「ファイルのアップロード」は不要になる。 (ファイルではなく,文字列を書き込んでどこかに保存すればよい。)
  • 「ファイルの添付」は不要になる。 (テキスト文字列をコピペするだけで,ファイルを送受信できる。)

Base64とは
http://ja.wikipedia.org/wiki/Base64

  • バイナリを英数字文字列に変換する。
  • メールの添付ファイル送信などの際に使われている技術。
  • データ量は約138%となる。


以下は,Windowsのバッチ(WSH)で

  • バイナリのファイルを,BASE64の文字列に変換する。
  • BASE64の文字列を,バイナリのファイルに変換する。

ためのサンプルコード。


エンコード・デコードの両方とも,コマンドプロンプトから実行できる。

base64.js

/*

BASE64の読み書きを行なうバッチ


エンコード方法:
cscript //nologo base64.js encode エンコードしたいファイルのパス > hoge.txt

デコード方法:
cscript //nologo base64.js decode hoge.txt 復元されたファイルの保存パス

*/



// ----------------- コマンドライン引数 --------------


var action_type = WScript.Arguments.Unnamed(0); // encode or decode
	//log( action_type );



// ----------------- 関数 --------------


function log(s){ WScript.Echo( s ); }


// エンコード実行
function base64encode( target_file_path )
{
	// ファイルをバイナリデータとして読み取り
	var stream = new ActiveXObject('ADODB.Stream');
	stream.Type = 1; // binary
	stream.Open();
	stream.LoadFromFile( target_file_path );
	var binary_data = stream.Read( -1 ); // -1:read all

	// 新規XMLデータを作成
	var xml = new ActiveXObject("Microsoft.XMLDOM");
	xml.loadXML('<?xml version="1.0" ?> <root/>');
	xml.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
	
	// バイナリデータを格納するためのノードを作成
	var node = xml.createElement("file-node");
	node.dataType = "bin.base64";
	
	// バイナリデータを格納
	node.nodeTypedValue = binary_data;
	xml.documentElement.appendChild( node );
	
	// そのノードからBASE64エンコード済み文字列を取り出す
	var base64encoded_text = node.text;
	return base64encoded_text;
	
};



// デコード実行
function base64decode( encoded_text_path, binary_file_save_path )
{
	// BASE64文字列を取得
	var fso_r = WScript.CreateObject( "Scripting.FileSystemObject" );
	var base64str = fso_r.OpenTextFile( encoded_text_path, 1 ).ReadAll();

	// 新規XMLデータを作成
	var xml = WScript.CreateObject("Microsoft.XMLDOM");

	// BASE64文字列を格納するためのノードを作成
	var node = xml.createElement("base64-node");
	node.dataType = "bin.base64";
	
	// バイナリデータを取得
	node.text = base64str;
	var binary_data = node.nodeTypedValue;

	// 書き込み
	var sw = new ActiveXObject("ADODB.Stream");
	sw.Type = 1; // binary
	sw.Open();
	sw.Write( binary_data );
	sw.SaveToFile( binary_file_save_path );
	sw.Close();
		
};



// ----------------- メイン処理 --------------



if( action_type == "encode" )
{
	var target_file_path = WScript.Arguments.Unnamed(1);
		//log( target_file_path );
	var ret =  base64encode( target_file_path );
	
	// エンコード結果を出力
	log( ret );
}
else if( action_type == "decode" )
{
	var encoded_text_path = WScript.Arguments.Unnamed(1);
	var binary_file_save_path = WScript.Arguments.Unnamed(2);
	
	// デコード結果を保存
	base64decode( encoded_text_path, binary_file_save_path );
}

使い方は,冒頭のコメントに書いてある通り。


符号化のアルゴリズムをまともに実装する事に取り掛かるのではなくて,

XMLを処理するためのAPIに丸投げしてやらせている,という点が面白い。



実装上の参考:

JavaScriptでBase64エンコードする。
http://d.hatena.ne.jp/takuya_1st/2009...


Microsoft.XMLDOMでBASE64デコード
http://apis.jpn.ph/fswiki/wiki.cgi?pa...