-------------------------------------------------------------
[感謝,御詫び]
http://not6.blog.shinobi.jp/Search/のhtmlソースを勝手にメモ
// Copyleft(c) Ippei
// license: Creative Commons
// http://www.creativecommons.jp/

-------------------------------------------------------------

[何をしたいか]
適当なファイル(私が想定したのはcomファイル)をページ上で作って
ダウンロードできるようにしたい。しかもcgiとかでなくてjsでファ
イルを作成させたい。

[対応]
Firefox,Opera

-------------------------------------------------------------

[概要]
データスキームを用いる。ファイルはバイナリになりそうなので、
BASE64に変換し、Dataスキーム(base64)でダウンロードさせる。

[Dataスキーム]

	data:application/octet-stream,(data)

という文字列(スキーム)が(data)というデータを表す。(data)には
データの中身を入れる。
もちろんapplication/octet-streamはzipファイルやlzhファイルの
mime-typeである。これによってブラウザはダウンロードを開始する。

 <a>タグのhref属性やJavaScriptのlocation.hrefなどでこのData
スキームにリンクさせればよい。

例えば
<a href="data:application/octet-stream,こんちわ。">メッセージをDLする</a>

のように。
上の例ではただ「こんちわ。」と書かれたファイルがダウンロード
できる。ただし、ファイル名はこちらから指定できないのが欠点。


	data:application/octet-stream;base64,(base64-data)

という文字列(スキーム)なら(base64-data)の所に、データの中身を
BASE64に変換した文字列にすることで、ブラウザが都合のいい時に
デコードしてくれる。これならバイナリなデータでも扱える。

[Base64に変換]
http://www.onicos.com/staff/iz/amuse/javascript/expert/
を参考すべし。
また、Firefoxに限定するなら、

	btoa(raw_string)

で、文字列raw_stringをbase64に変換する関数btoaが標準に付いている。

[Dataスキーム(2)]
本初の目的と少しずれるがメモしておく。
Dataスキームで作ったデータを、例えば作った画像データをその場で
htmlに表示することができる。

function createGIF(data){	//gifを作るテスト
	var myData = document.createElement("img");	//タグ名(要素)
	myData.type = "image/gif";	//データのmime-type
	myData.src = "data:application/octet-stream;base64,"+data;
	document.body.appendChild(myData);//例えばdocument.bodyの最後に追加
}
createGIF("\
Qk2uAAAAAAAAADYAAAAoAAAABgAAAAYAAAABABgAAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAD/\
QID/AP//AP8A/wAAgACAAAAAAP9AgP8A//8A/wD/AACAAIAAAAAA/0CA/wD//wD/AP8AAIAAgAAA\
AAD/QID/AP//AP8A/wAAgACAAAAAAP9AgP8A//8A/wD/AACAAIAAAAAA/0CA/wD//wD/AP8AAIAA\
gAAA");

6x6の二次色の正方形が表示されたらok。
<img src="example.gif">
っていうファイル名("example.gif")の代わりにdataスキームを書く。
ただ、拡張子がないので、typeでmime-typeを書いておかないとダメぽい。


[.com(機械語)の知識]
当初の目的はcomファイルの製作だった。comファイルは、
アセンブラを16進法にしたものを繋げればよい。
16進法でどうするかは例えばコマンドプロンプト
(MS-DOS)を使う。
|| >debug
|| -a 100
|| 2C9B:0100 mov bx , feff
|| 2C9B:0103
|| -d 100
|| 2C9B:0100 BB FF FE 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
|| 2C9B:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 8A 2C ............4..,
|| -
実際にあなたがkey boardで入力するのは太字の文字
のみなので難しいことは無い。
例えばmov bxというアセンブラで言うニモニックは
BBとなる。これをjavascriptでは16進法のBBということで
\xbbと打つ。
var a = "\xbb";
これをBASE64にすればよい。

----------------------------------------------------------
[もっと詳しく]
data schemeの仕様(英語)
http://www.ietf.org/rfc/rfc2397.txt