ADODB.Streamなしに、WSHでバイナリを出力する
方法を思いつきました。
いまだ、この手のワードで検索されるので、書いておきます。
ただ、ニーズがあるかどうか不明なので、完成はさせてません。
しかも縛りが多いし。
制約
ヒント
方法
- 最初の2バイトは、ASCIIモードで出力する
- 最初の2バイトに、ASCII範囲外がある場合は、WScript.Shellで1バイトファイルを結合して作成
- 残りは、Unicodeモードで2バイトづつ出力する
- 最後が2バイトにならない場合(全体が奇数バイトの場合)、ASCIIで出力する
- こちらも、ASCII範囲外の場合は、copyでの結合を行う
今回の検討に使用したコード
var ForReading = 1; var ForWriting = 2; var ForAppending = 8; var TristateUseDefault = -2; // システムデフォルトでファイルを開く var TristateTrue = -1; // ファイルをUnicodeファイルとして開く var TristateFalse = 0; // ファイルをASCIIファイルとして開く var OutFile = "binOut.out"; var OutStream, res; var WshShell = WScript.CreateObject("WScript.Shell"); var fso = new ActiveXObject("Scripting.FileSystemObject"); var scriptPath = WScript.ScriptFullName.substr(0, WScript.ScriptFullName.length - WScript.ScriptName.length); WScript.Echo(scriptPath); res = WshShell.Run("cmd /c copy /b binOut80.bin + binOut81.bin " + OutFile, 0, true); OutStream = fso.OpenTextFile(OutFile, ForAppending, true, TristateFalse); for(i = 0; i < 128; i++) { OutStream.Write(String.fromCharCode(i)); } OutStream.Close(); OutStream = fso.OpenTextFile(OutFile, ForAppending, true, TristateTrue); for(i = 0; i < 65536; i++) { OutStream.Write(String.fromCharCode(i)); } OutStream.Close(); WScript.Echo("Fin!");
- binOut80.bin は、0x80が書かれたファイル。binOut81.binは、0x81。
ニーズがあれば、作成しますよ。
ニーズがあればね。
、、、ってか、「copy /b」を使う時点で、256個のバイナリがあれば出来るって話も、、、。
ついでに、前検討したWSHのBase64エンコード・デコードにトラックバックしときましょ。
WSHでBase64
JScriptでBase64デコード