昔にすっかり挫折してしまっていた表題のスクリプトが動きました。 単純にうれしい。
携帯電話で撮った画像などを赤外線通信を使って簡単にPCに取り込むことが出来ます。 内容は以下のようになっています。
BEGIN:VNOTE
VERSION:1.1
X-DOCOMO-TYPE:JPEG
X-DOCOMO-SIZE:288X352
X-DOCOMO-FILESIZE:26660byte
X-DOCOMO-FILENAME:DSC00066.jpg
SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=SHIFT_JIS:
DATE:20040301T041400Z
X-DOCOMO-BODY;ENCODING=BASE64:/9j/4ROpRXhpZgAASUkqAAgAAAAJAA
中略
p4mXaD5ciN1c0AcjNeSXF7dSiMkyfPucdD61ESXmlZn3ZAbjpmkM/9k=
END:VNOTE
この中の base64 でエンコードされた部分をデコードして画像ファイルにしなければなりません。 今までは、このデコード部分をC++ や PERL で書いて使っていたわけですが、単純にスクリプトだけで実現してみたかった。
var fso = new ActiveXObject("Scripting.FileSystemObject");
var textStream = fso.OpenTextFile("mypic.vnt", 1, false);
var s = textStream.ReadAll();
textStream.close();
var s2 = s.split("X-DOCOMO-BODY;ENCODING=BASE64:");
var s3 = s2[1].split("\r\nEND:VNOTE");
var s4 = base64decode(s3[0]);
var binaryStream = new ActiveXObject("ADODB.Stream");
binaryStream.Open();
binaryStream.Charset = "ISO-8859-1";
binaryStream.WriteText(s4);
binaryStream.Position = 0;
binaryStream.Type = 1;
binaryStream.SaveToFile("gazou.jpg", 2);
binaryStream.Close();
この中の base64decode() は数日前に書いたとおりです。
ADO.Stream にセキュリティホール が発見され、ひどい状態になってしまいましたが、Scripting.FileSystemObject でバイナリデータが扱えない今、何とか安全に使いたいものです。