LoginSignup
8
3

More than 5 years have passed since last update.

JScriptでBase64

Posted at

はじめに

以前、JScriptでHash取得で.NETの一部が使えるとの事で調べていくと、
「System.Security.Cryptography.ToBase64Transform」や
「System.Security.Cryptography.FromBase64Transform」といった、
Base64系のクラスがあったので、これらを利用して、
Base64エンコード、デコードのサンプルメソッドを作ったのですが、
よくよく調べてみると、「Msxml2.DOMDocument」で簡単に出来る事が分かりました。

Base64

// 「byte配列」から「Base64」に変換
function bytes2base64(bytes) {
    var base64 = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成(base64)
    var element = doc.createElement("base64");
    // 「dataType」に「bin.base64」を設定
    element.dataType = "bin.base64";
    // 「nodeTypedValue」に「byte配列」を設定
    element.nodeTypedValue = bytes;
    // 「text」を取得
    base64 = element.text;
    // 後処理
    element = null;
    doc = null;
    return base64;
}

// 「Base64」から「byte配列」に変換
function base642bytes(base64) {
    var bytes = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成(base64)
    var element = doc.createElement("base64");
    // 「dataType」に「bin.base64」を設定
    element.dataType = "bin.base64";
    // 「nodeTypedValue」に「byte配列」を設定
    element.text = base64;
    // 「text」を取得
    bytes = element.nodeTypedValue;
    // 後処理
    element = null;
    doc = null;
    return bytes;
}

蛇足

簡潔になりすぎたので、Base64とは全く関係ありませんが蛇足です。
実際に使う場面は無いと思われます、読み飛ばし推奨です。

「Msxml2.DOMDocument」オブジェクトの「dataType」ですが、
「string、number、Int、Boolean、dateTime、bin.hex、bin.base64」などあります。

以前、.NETの「System.Text.StringBuilder」が利用できるとわかった時
「AppendFormat」メソッドを上手に使えないかなと思ったのですが、
実際は、JScriptのDate型がそのまま渡せず、断念しました。

「dataType」の「dateTime」を使うとどうやらいけるようです。
ただし、コードが長いだけで、意味は無いかもしれません。

// 「文字列」から「dateTime型」へ変換
function string2dateTime(string) {
    var dateTime = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成(dateTime)
    var element = doc.createElement("dateTime");
    // 「dataType」に「dateTime」を設定
    element.dataType = "dateTime";
    // 「nodeTypedValue」に「byte配列」を設定
    element.text = string;
    // 「text」を取得
    dateTime = element.nodeTypedValue;
    // 後処理
    element = null;
    doc = null;
    return dateTime;
}

変換対象の文字列はXMLのdateTimeフォーマットに合わせると、一応できるようです。

// 「StringBuilder」オブジェクト生成
var builder = new ActiveXObject("System.Text.StringBuilder");

// 現在日時取得
var date = new Date();
// 「yyyy-MM-dd'T'HH:mm:ss」型の文字列生成
var string = date.getFullYear() + "-"
            + ("0" + (date.getMonth() + 1)).slice(-2) + "-"
            + ("0" + date.getDate()).slice(-2) + "T"
            + ("0" + date.getHours()).slice(-2) + ":"
            + ("0" + date.getMinutes()).slice(-2) + ":"
            + ("0" + date.getSeconds()).slice(-2);

// 「dateTime」取得
var dateTime = string2dateTime(string);

// フォーマット
builder.AppendFormat("{0:yyyy/MM/dd HH:mm:ss dddd tt zzz}", dateTime);
WScript.Echo("" + builder.ToString());

// 後処理
builder = null;
8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3