[C# サンプル] バイナリファイルの内容を型を指定して読み込む

System.IO.BinaryReaderクラスを使うとバイナリのデータから型を指定して読み込むことが出来ます。

スポンサーリンク

System.IO.BinaryReaderクラスの使い方

とりあえずサンプルです。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // 読み込むファイルのパス
        string filePath = @"D:\test.exe";
        
        // FileStreamのインスタンスを作成
        using var fs = File.OpenRead(filePath);
        
        // BinaryReaderのインスタンスを作成
        var br = new BinaryReader(fs);

        // 読込位置の表示、先頭は0
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");

        // int型で読み込み
        Console.WriteLine($"int={br.ReadInt32()}");
        // 読込位置の表示、int型のサイズ分進んだ
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");

        // byte型で読み込み
        Console.WriteLine($"byte={br.ReadByte()}");
        // 読込位置の表示、byte型のサイズ分進んだ
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");

        // byte[]型で読み込み
        Console.WriteLine($"byte[10]={string.Join(" ", br.ReadBytes(10))}");
        // 読込位置の表示、byte[]型のサイズ分進んだ
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");

        // double型で読み込み
        Console.WriteLine($"double={br.ReadDouble()}");
        // 読込位置の表示、double型のサイズ分進んだ
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");
    }
}

出力結果はこんな感じです。

読込位置=0
---------------------------
int=9460301
読込位置=4
---------------------------
byte=3
読込位置=5
---------------------------
byte[10]=0 0 0 4 0 0 0 255 255 0
読込位置=15
---------------------------
double=2.32725E-319
読込位置=23
---------------------------

使い方はわかったからもういいやという人はここで終わりです。
次からはサンプルコードの解説です。

スポンサーリンク

サンプルコードの解説

BinaryReaderクラスを使うにはまずSystem.IO.FileOpenReadメソッドを使ってファイルを開く必要があります。このメソッドは引数で指定されたパスのファイルを読み取り専用で開きます。指定したファイルが存在しない場合はエラーになるので注意してください。

// FileStreamのインスタンスを作成
using var fs = File.OpenRead(filePath);

次にBinaryReaderのコンストラクターにOpenReadで作ったインスタンスを指定します。

// BinaryReaderのインスタンスを作成
var br = new BinaryReader(fs);

BinaryReaderインスタンスのReadInt32メソッドを使ってバイナリのデータをint型で読み込みます。
ReadInt32メソッドは現在の読込位置から4バイトのデータを取得してint型に変換します。そして読込位置を4バイト先に進めます。
読込位置はFileStreamクラスインスタンスのPositionプロパティで取得できます。0が先頭です。

Console.WriteLine($"読込位置={fs.Position}"); // 0(ファイルの先頭)
Console.WriteLine($"int={br.ReadInt32()}");   // 4バイト分(0~3バイト目)読み込んでintに変換
Console.WriteLine($"読込位置={fs.Position}"); // 4(次は4バイト目から読み込む)

BinaryReaderの読み込み用メソッド一覧

メソッド戻り値の型読み込むバイト数
ReadBoolean()boolean1
ReadByte()byte1
ReadBytes(読み込む数)byte[]1 × 読み込む数
ReadChar()char1文字(文字コードに依存)
ReadChars(読み込む数)char[]1文字(文字コードに依存) × 読み込む数
ReadDecimal()decimal16
ReadDouble()double8
ReadInt16()short2
ReadInt32()int4
ReadInt64()long8
ReadSByte()sbyte1
ReadSingle()float4
ReadUInt16()ushort2
ReadUInt32()uint4
ReadUInt64()ulong8

文字コードの指定

文字コードを指定する場合は、BinaryReaderのコンストラクターの第2引数に文字コードを指定します。

var br = new BinaryReader(fs, System.Text.Encoding.UTF8);

読込位置を移動する

現在の読込位置を変更するには、FileStreamクラスインスタンスのPositionプロパティに新しい位置を設定します。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // 読み込むファイルのパス
        string filePath = @"D:\test.exe";

        // FileStreamのインスタンスを作成
        using var fs = File.OpenRead(filePath);

        // BinaryReaderのインスタンスを作成
        var br = new BinaryReader(fs);

        // 読込位置を変更(10バイト目から)
        fs.Position = 10;
        Console.WriteLine($"読込位置={fs.Position}");

        // int型で読み込み
        Console.WriteLine($"int={br.ReadInt32()}");
        // 読込位置の表示、int型のサイズ分進んだ
        Console.WriteLine($"読込位置={fs.Position}");
        Console.WriteLine("---------------------------");
    }
}
読込位置=10
int=-65536
読込位置=14
---------------------------

C# プログラミング講座に戻る

コメント

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