C# – バイナリデータのダンプ出力

概要

バイナリデータのダンプ(データの表示) を行います。

実装例

using System;
using System.IO;

namespace BinaryEditorBase
{
    public static class BinaryEditor
    {
        /// <summary>
        /// バイト列の簡易ダンプ
        /// </summary>
        /// <param name="binaryData">バイト列</param>
        /// <param name="offset">オフセットバイト</param>
        /// <param name="readLength">読み込みサイズ</param>
        /// <returns></returns>
        public static string Dump(ref byte[] binaryData, uint offset, int readLength)
        {
            // ダンプデータ作成用の「StringBuilder」インスタンス
            System.Text.StringBuilder OutputBuffer = new System.Text.StringBuilder();
            // オフセット値にダンプデータ出力開始位置の補正
            uint dummyStart = offset - (offset % 0x10);
            // ヘッダ出力
            OutputBuffer.Append("ADDRESS  : ");
            if (binaryData.Length > 0)
            {
                for (int i = 0; i <= 0x0f; i++)
                {
                    // 下2桁のアドレス値をヘッダ行に出力
                    OutputBuffer.Append(i.ToString("X2"));
                    // 下2桁が「0x0F(15)」の場合、改行を出力
                    if (i == 0x0f)
                    {
                        OutputBuffer.Append(System.Environment.NewLine);
                    }
                    // 2桁毎に空白を出力
                    else
                    {
                        OutputBuffer.Append(" ");
                    }
                }
                // 区切り線出力
                OutputBuffer.Append("---------:---------------" +
                    "---------------------------------" + Environment.NewLine);
                // データ出力
                for (uint k = dummyStart; k < binaryData.Length; k++)
                {
                    // 現在のアドレスが読み込み範囲を超えた場合、読み込み終了
                    if (k > readLength + offset)
                    {
                        OutputBuffer.Append(System.Environment.NewLine);
                        break;
                    }
                    // 下2桁が「0x00(0)」の場合、ベースアドレスを出力
                    if (k % 0x10 == 0)
                    {
                        OutputBuffer.Append(k.ToString("X8") + " : ");
                    }
                    // 開始アドレスのオフセットが指定されている場合、
                    // オフセット分空白を出力
                    if (k < offset)
                    {
                        OutputBuffer.Append("  ");
                    }
                    // データを出力
                    else
                    {
                        OutputBuffer.Append(binaryData[k].ToString("X2"));
                    }
                    // 下2桁が「0x0F(15)」の場合、改行を出力
                    if ((k + 0x01) % 0x10 == 0)
                    {
                        OutputBuffer.Append(System.Environment.NewLine);
                    }
                    // 2桁毎に空白を出力
                    else
                    {
                        OutputBuffer.Append(" ");
                    }
                }
                return OutputBuffer.ToString();
            }
            else
            {
                return "No Data.";
            }
        }

        [STAThread]
        static void Main()
        {
            try
            {
                // ファイルからデータを読み込み、byte型配列に格納
                // ファイルのパスは必要に応じて変更
                FileStream fs = new FileStream("../../test.bin", FileMode.OpenOrCreate,
                    FileAccess.ReadWrite, FileShare.Read);
                BinaryReader binReader = new BinaryReader(fs);
                fs.Seek(0x00000000, SeekOrigin.Begin);
                byte[] binData = binReader.ReadBytes((int)fs.Length);
                // バイナリのダンプ
                Console.Write(BinaryEditor.Dump(ref binData,
                    0x0000004, 0x00000100));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // 終了処理
            Console.Write("何かキーを押してください");
            Console.Read();
        }
    }
}

色々ごちゃごちゃとしてますが、基本的には表示の整形が殆どです。ソースの説明をするよりは、 実際に動かしてみる方が動作が分かりやすいと思います。

103~104行目のダンプメソッド「BinaryEditor.Dump(~)」の引数を変更することで、 出力結果が変わります。

第2引数はオフセットで、これを指定することで、出力を開始する アドレスを設定できます。16で割り切れる数値と、そうでない数値とで出力結果を比較してみてください。

第3引数で出力するデータの範囲を指定できます。ファイルのサイズより大きい値を設定した場合はファイルのサイズまでが、 ファイルのサイズより小さい値を設定した場合は、その範囲内で出力されます。