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は古くても、そこで培うアルゴリズムの思考は一生モノ。
ぜひ、自分の手でチェックサムを計算させ、「ファイルが壊れていないこと」を確認してみてください。その瞬間、あなたはマクロを記録するだけのユーザーから、「システムを制御するエンジニア」へと進化しています。
何か不明点があれば、いつでも聞いてください。応援していますよ。
