【入門編】【バイナリファイル操作】ADODB.Stream を利用した画像やZIPファイルのバイト列読み込みと16進数パース – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは。自動化の世界へようこそ。
VBScriptという言語は、一見すると古臭く、現代の洗練された言語に比べれば「不自由」に見えるかもしれません。しかし、Windowsという巨大なOSの深淵に、インストール不要で直接ダイブできるこの言語には、プロフェッショナルだけが知る「静かなる強さ」があります。

今日は、テキスト処理の域を超え、バイナリ(画像やZIP)の魂である「バイト列」に直接触れる技術を伝授しましょう。この扉を開ければ、君はもう「マクロの記録」ボタンを押すだけの存在ではなくなります。

1. なぜ「ADODB.Stream」なのか?

VBScriptには、標準でバイナリを扱うための高度な型は存在しません。そこで我々が召喚するのが `ADODB.Stream` オブジェクトです。本来はデータベース用ですが、こいつは「メモリ上のバイトの運び屋」として最高に優秀です。

重要なのは、`Type = 1 (adTypeBinary)` を指定すること。これによって、OSは文字コードの変換という「お節介」をやめ、純粋な0と1の塊としてデータを差し出してくれるようになります。

2. バイナリを読み込むための定石

まずは、ファイルをメモリにロードする基本形です。

‘ ADODB.Streamを生成
Set objStream = CreateObject(“ADODB.Stream”)
objStream.Type = 1 ‘ 1 = Binaryモード
objStream.Open

‘ ファイルをロード
objStream.LoadFromFile “C:\test\sample.jpg”

‘ 全データをバイト配列として取り出す
binData = objStream.Read
objStream.Close
Set objStream = Nothing

ここでの `binData` は、VBScriptの内部で「Variant型のバイト配列」として保持されます。これが今回の主役です。

3. バイナリを「透視」する魔法の関数

バイト配列の中身を覗くには、特殊な関数が必要です。ここが初心者が最も躓きやすいポイントです。

  • `LenB(binData)`: バイト配列の「全体のサイズ」を返します。
  • `MidB(binData, start, length)`: 文字列のMid関数とは異なり、バイト単位で切り出します。
  • `AscB(char)`: 切り出した1バイトを、0〜255の数値に変換します。

これらを組み合わせれば、ファイルヘッダー(ファイルの先頭にある署名)を解析し、「これが本当にJPEGなのか?ZIPなのか?」を判別できるのです。

4. 実践:16進数ダンプ・パース・エンジン

では、実際にファイルの先頭数バイトを読み取り、16進数文字列として表示するコードを見てみましょう。

‘ — バイナリ解析エンジン —
Function GetHexDump(binData, length)
Dim i, byteVal, hexStr
hexStr = “”

‘ 指定した長さ分だけループ
For i = 1 To length
‘ MidBで1バイト切り出し、AscBで数値(0-255)へ
byteVal = AscB(MidB(binData, i, 1))

‘ 16進数に変換(Hex関数)し、2桁0埋め
hexStr = hexStr & Right(“0″ & Hex(byteVal), 2) & ” ”
Next
GetHexDump = hexStr
End Function

‘ — 実行部 —
Set objStream = CreateObject(“ADODB.Stream”)
objStream.Type = 1
objStream.Open
objStream.LoadFromFile “example.zip” ‘ 任意のファイルを指定

binData = objStream.Read
‘ 先頭4バイトを解析(ZIPファイルのシグネチャは 50 4B 03 04)
WScript.Echo “ファイルヘッダー: ” & GetHexDump(binData, 4)

objStream.Close

5. 初学者が陥りやすい罠と対策

現場のエンジニアとして、君にこれだけは伝えておきたい「罠」があります。

① 配列のインデックスは「1」から始まる

VBScriptの `MidB` は、他の言語(0スタートが一般的)と異なり、インデックスが1から始まります。`MidB(binData, 0, 1)` と書くとエラーになるので注意してください。

② メモリの限界

`objStream.Read` はファイル全体をメモリにロードします。数GBの巨大な動画ファイルを読み込もうとすると、VBScriptのプロセスはメモリ不足で即座にクラッシュします。大きなファイルを扱う際は、`Read(size)` を使って「小分けに読む」という職人技が必要になります。

③ 64bit環境での制約

`ADODB.Stream` は古い技術ですが、現代の64bit Windowsでも健在です。ただし、COMオブジェクトとしての挙動には癖があるため、必ず `Set obj = Nothing` で明示的に解放し、メモリリークを防ぐのが「プロの作法」です。

最後に:君へのエール

バイナリを触れるようになったということは、君はもう「ブラウザやエディタ越しに見える世界」ではなく、「OSが直接処理している生の情報」にアクセスできるようになったということです。

これは、システムのトラブルシュートや、レガシーなデータ変換、あるいは隠された仕様の解明において最強の武器になります。

まずは、適当な画像ファイルをこのスクリプトに食わせてみてください。`FF D8 FF E0…` と表示された瞬間、きっと君は「コンピュータと対話している」という実感を深く味わえるはずです。

さあ、次はどんなバイナリを料理しますか?応援していますよ。

タイトルとURLをコピーしました