VB.NET にて、バイナリファイルを扱う方法を記載しておきます
まず、レガシー文字列命令を Str にて呼び出せるようにしておきます。(これは私が慣れているからです ^^;)
Imports Str = Microsoft.VisualBasic.Strings
ファイル全てをバイナリ配列に読み込みます
Dim fname As String = "C:\MyFileName.bin"
Dim fs As New System.IO.FileStream(fname, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim ByteArray(fs.Length - 1) As Byte
fs.Read(ByteArray, 0, ByteArray.Length)
ビットコンバータを使って、内容を部分的に読み込みます。
OffsetAddress には、バイト配列内の位置を指定します。
例えば single 型なら、自動的に OffsetAddress で指定した位置から、
4バイトが切り取られて読み込まれます。
Dim MyVal as Single
MyVal = BitConverter.ToSingle(ByteArray, OffsetAddress)
ファイル内容を読みこんだバイト配列全体から、文字列を抽出する際は、
以下のように Buffer.BlockCopy を使用します。
OffsetAddress で指定した位置から抽出されます。
Dim ByteArray2(10) as Byte
Buffer.BlockCopy(ByteArray, OffsetAddress, ByteArray2, 0, 10)
MyString = Replace(System.Text.Encoding.GetEncoding(932).GetString(ByteArray2), Chr(0), "")
(&H0 を除去しています。932 は SHIFT_JIS のことです。)
バイト配列の内容を変更して上書きする際は、以下のように Buffer.BlockCopy を使用します。
MyVal の値が OffsetAddress で指定した位置に書き込まれます。
Buffer.BlockCopy(BitConverter.GetBytes(MyVal), 0, ByteArray, OffsetAddress, BitConverter.GetBytes(MyVal).Length)
ファイル内容の変更が終わったら、
Dim fname2 As String = Str.Left(fname, InStrRev(fname, ".") - 1) & "_" & Format(Now, "yyyyMMddHHmmss") & Str.Mid(fname, InStrRev(fname, "."))
Dim fs2 As New System.IO.FileStream(fname2, System.IO.FileMode.Create, System.IO.FileAccess.Write)
fs2.Write(ByteArray, 0, ByteArray.Length)
fs2.Close()
のようにして、バイト配列全体をファイルにて出力します。
以上で、説明は終了です。
|