【入門編】実務中級者向け:VB.NETでのバイナリファイル解析:BinaryReaderとBinaryWriterによる独自フォーマットの読み書き実装 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

プロの現場へようこそ。

「Excelマクロ(VBA)で動いていた業務を、より堅牢なシステムへ昇華させたい」。そう思ったとき、避けて通れないのが「バイナリファイル」の直接制御です。

テキストファイル(CSVやJSON)は人間が読みやすいですが、システム間の高速なデータ交換や、独自仕様のファイル形式を扱う際には、バイナリ(0と1の塊)を直接読み書きする技術が必須となります。

今日は、VB.NETの`BinaryReader`と`BinaryWriter`を使い、メモリ効率と堅牢性を両立させた「プロの現場で使える読み書きパターン」を伝授しましょう。

1. なぜ「バイナリ」を扱うのか?

テキストファイルは、数値すら「文字」として保存します。例えば「1234567」という数値は、テキストなら7バイト消費しますが、バイナリ(Integer型)なら4バイトで済みます。

さらに、「データの型」を厳密に定義できるため、読み込み時の解釈ミス(パースエラー)を劇的に減らすことができるのです。

2. BinaryWriterでデータを書き出す

まずは「書き込み」から。ファイルを保存する際は、必ず`FileStream`を`Using`ブロックで囲みましょう。これにより、エラー発生時でも確実にファイルが閉じられ、メモリリークや破損を防げます。

Imports System.IO

Public Sub WriteCustomData(filePath As String)
‘ データを書き出す準備
‘ FileMode.Createは、ファイルがなければ作成、あれば上書きします
Using fs As New FileStream(filePath, FileMode.Create, FileAccess.Write)
Using writer As New BinaryWriter(fs)
‘ 文字列は「長さ(Byte数)」+「文字データ」の形式で保存されます
writer.Write(“DATA_HEADER”)
‘ 整数値はメモリ上の形式(Little Endian)で4バイト書き込まれます
writer.Write(12345)
‘ 小数点も正確に保持
writer.Write(98.6)

‘ ここで重要:Flushを意識しなくてもUsing終了時に自動で閉じてくれます
End Using
End Using
End Sub

【プロの知見】陥りやすい罠:エンディアン

PCのCPUの多くは「リトルエンディアン」という形式で数値を保存します。もし、古い産業機器のデータなどを読み込む場合、データの並び順が逆(ビッグエンディアン)である可能性があります。その際は`BinaryReader/Writer`のラッパーを自作する必要が出てきます。まずは「標準的なPC環境ならこのままでOK」と覚えておけば大丈夫です。

3. BinaryReaderでデータを読み込む

書き込んだ順序と「同じ順序・同じ型」で読み込むことが鉄則です。ここを間違えると、ファイルの内容がズレてしまい、ゴミデータしか読み込めません。

Public Sub ReadCustomData(filePath As String)
If Not File.Exists(filePath) Then Return

Using fs As New FileStream(filePath, FileMode.Open, FileAccess.Read)
Using reader As New BinaryReader(fs)
Try
‘ 書き込んだ順番と完全に一致させること
Dim header As String = reader.ReadString()
Dim id As Integer = reader.ReadInt32()
Dim value As Double = reader.ReadDouble()

Console.WriteLine($”Header: {header}, ID: {id}, Value: {value}”)
Catch ex As EndOfStreamException
‘ ファイルの終端に達した際のエラー処理
Console.WriteLine(“データの読み込み中に終端に達しました。”)
End Try
End Using
End Using
End Sub

4. 現場で「死なない」ための3つの鉄則

① 型のサイズを意識せよ

`ReadInt32`は必ず4バイトを消費します。もし読み込む対象が2バイトの整数(Short型)だった場合、`ReadInt16`を使わなければ、以降のデータ読み込みがすべて狂います。設計書と実装を常に照らし合わせてください。

② Try-Catchで「異常」を握りつぶさない

バイナリファイルは破損している可能性があります。読み込み失敗時にログを吐かずに無視すると、その後の業務処理がすべてデタラメな値で動くことになります。エラーは「早期に検知」が鉄則です。

③ Using句を神聖視せよ

VB.NETの`Using`は、単なる省略記法ではありません。`Dispose`メソッドを確実に呼び出し、OSのリソースを解放する重要な儀式です。「ファイルを掴んだまま離さない」というバグは、現場では最も嫌われるミスの筆頭です。

まとめ:次のステップへ

バイナリファイルの読み書きをマスターしたあなたは、もう「マクロの記録」の枠を超えました。次は、複雑な構造体を`Structure`として定義し、それをバイト配列に変換して一括でファイルに書き出す「構造化バイナリ」の世界に挑戦してみてください。

「コードを書く」ということは、単に動くものを作るだけでなく、「将来の保守担当者が泣かないコード」を残すことでもあります。

さあ、あなたのプログラムで、業務をさらに効率的に、そして美しく変えていきましょう!応援していますよ。

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