【入門編】【純粋VBScriptデータ検証】ADODB.Stream による CRC32 チェックサム計算アルゴリズムの自作とファイル完全性検証 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで究極のデータ検証を。ADODB.Streamとビット演算で挑むCRC32の世界

こんにちは。自動化の現場でVBScriptという「古の武器」を研ぎ澄まし続けているエンジニアです。

今日は、VBScriptの真髄に迫ります。「外部コマンド(certutilなど)に頼らず、純粋に言語の力だけでファイルの完全性を検証する」。これこそが、環境を選ばない堅牢な自動化の第一歩です。

今回は、ADODB.Streamでバイナリを読み込み、ビット演算を駆使してCRC32チェックサムを算出するという、一見マニアックながら、エンジニアとしての基礎力が試される極限のテーマに挑みましょう。

1. なぜ「外部コマンド」を使わないのか?

業務自動化の現場では、セキュリティポリシーによりPowerShellの実行が制限されていたり、余計な外部ツールをインストールできない環境が多々あります。

VBScriptはWindowsに標準搭載されており、今回紹介する`ADODB.Stream`は、バイナリデータをメモリ上で安全に取り扱うための最強のツールです。これと「ビット演算」を組み合わせれば、どんな環境でもファイルの同一性を担保できるのです。

2. 実装の心臓部:CRC32のアルゴリズム

CRC32は、データを32ビットの整数値に圧縮し、転送前後でその値が一致するかを見る手法です。VBScriptには残念ながら「符号なし32ビット整数(unsigned long)」という型がないため、ビット演算(And, Xor)を駆使して「符号付き整数を無理やり符号なしとして扱う」テクニックが必要になります。

実装コード:CRC32計算エンジン

以下のコードを `checksum.vbs` として保存してください。

Option Explicit

‘ CRC32計算用テーブルの生成
Dim CrcTable(255)
Call InitCrcTable()

‘ ファイルを読み込みチェックサムを計算
Function GetCRC32(filePath)
Dim ado, buffer, i, crc, b
Set ado = CreateObject(“ADODB.Stream”)
ado.Type = 1 ‘ adTypeBinary
ado.Open
ado.LoadFromFile filePath

buffer = ado.Read(-1) ‘ 全データを読み込む
ado.Close

crc = &HFFFFFFFF
For i = 1 To LenB(buffer)
b = AscB(MidB(buffer, i, 1))
‘ ビット演算でCRC32の更新
crc = CrcTable((crc Xor b) And &HFF) Xor ((crc \ 256) And &H00FFFFFF)
Next

‘ 最後に反転して返す
GetCRC32 = Not crc
End Function

‘ CRC32テーブルの初期化(高速化の定石)
Sub InitCrcTable()
Dim i, j, c
For i = 0 To 255
c = i
For j = 0 To 7
If (c And 1) Then
c = &HEDB88320 Xor ((c \ 2) And &H7FFFFFFF)
Else
c = (c \ 2) And &H7FFFFFFF
End If
Next
CrcTable(i) = c
Next
End Sub

‘ — 使用例 —
Dim targetFile: targetFile = “C:\temp\test.txt”
WScript.Echo “CRC32: ” & Hex(GetCRC32(targetFile))

3. ここがポイント!初心者が陥る「罠」と克服法

このコードを書く上で、多くの人がつまづくポイントを解説します。

① 「符号付き整数」の壁

VBScriptの整数型は符号付きです。そのため、ビットを右にずらす時、単なる「右シフト」ではなく、数値的な除算 `\ 256` を用いて、符号ビットの影響を排除する必要があります。

② ADODB.Stream のメモリ管理

`ado.Read(-1)` は非常に強力ですが、巨大なファイルを読み込むとメモリを食いつぶします。実運用では、数MB単位で `Read(size)` をループさせるのが、メモリリークを防ぐ「プロの作法」です。

③ 文字コードの罠

`ADODB.Stream` をバイナリモード(`Type = 1`)で開くのを忘れないでください。テキストモードで開くと、改行コードが勝手に置換され、ハッシュ値が狂います。

4. 最後に:なぜこれを学ぶのか

「自動化ができる」のと「堅牢なシステムが作れる」のは違います。

今回学んだ「バイナリを直接制御する」という視点は、VBScriptだけでなく、PythonやC#へステップアップした時にも必ず役に立つ基礎教養です。VBScriptは古くても、そこで培うアルゴリズムの思考は一生モノ。

ぜひ、自分の手でチェックサムを計算させ、「ファイルが壊れていないこと」を確認してみてください。その瞬間、あなたはマクロを記録するだけのユーザーから、「システムを制御するエンジニア」へと進化しています。

何か不明点があれば、いつでも聞いてください。応援していますよ。

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