VBScriptでバイナリファイルの読み書き

出来たのか・・いかん、これは不勉強。


(参考)「1.WSHの便利な道具(オブジェクト)たち
(参考)「MSDN - ADO API Reference - Stream


ついこないだ「VBScriptだとバイナリファイルの読み書き出来ないんっスよねー」と言いつつVisual C++の使用をごり押して決めたばっかりだったのだけど(使ったのはExpress Edition)、プログラムはリリースしちゃったしこいつは黙っておこう・・


以下ADODB.Stream の習作、特定のバイナリパターンを検索するプログラム
bfind.vbs


' usage:
' >cscript //nologo bfind.vbs <filename> <binptn>
' <binptn>: hex string (ex. 0d0a

function open_bin_file(fname)
dim res: set res = CreateObject("ADODB.Stream")
res.open
res.type = 1
res.LoadFromFile(fname)
set open_bin_file = res
end function

function arg_to_bin(arg)
dim l, i
dim res()
l = len(arg)
if (l mod 2) = 1 then
wscript.echo "the length is odd."
err.raise 1
end if
l = l/2
redim res(l-1)
for i = 0 to l-1
execute "res(i) = &H" & mid(arg, i*2+1, 2)
next
arg_to_bin = res
end function

sub bin_find(stream, bin)
dim start, idx, byt
idx = 0
do while not stream.eos
byt = stream.read(1)
if bin(idx) = ascb(midb(byt,1)) then
if idx = 0 then
start = stream.position - 1
end if
idx = idx + 1
if idx = ubound(bin) + 1 then
wscript.echo "found: " & start
idx = 0
end if
else
idx = 0
end if
loop
end sub

dim s: set s = open_bin_file(wscript.arguments(0))
dim b: b = arg_to_bin(wscript.arguments(1))
bin_find s, b

s.close