ページを修正する

16進数でページを修正する「修正(&U)メニュー」を実装します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 修正はバッファ(byte[] byt)に対して行われます。
    従ってページを変えて元のページに戻ると修正前の状態に戻ります。
    バッファの内容をファイルに書くときは、書き込み(&W)を実行して下さい。
    バッファ単位で上書きするので、削除や追加は出来ません。
  2. 描画中のバッファの修正は、TextBox の16進数を直接タイプして行います。
    Update() 関数で TextBox のテキストを取得して edit.bytEdit() 関数を呼び出します。
    修正したページが描画されるように SW を 2 に設定して Invalidate() を実行します。
        // byt[256] を16進数で修正する
        private void Update(object sender, EventArgs e)
        {
            string  wstr;
            wstr = textBox1.Text;   //表示中の Text Box
            //Console.WriteLine(wstr);
            edit.bytEdit(wstr);
            SW = 2;
            Invalidate();
        }
    
  3. class Edit の bytEdit() 関数です。
    受け取った wstr を改行コード(\n)で切り分けて、hexMode(ws[i], i) 関数を呼び出します。
    ws[i] が Text Box の一行分のデータで i が行番号です。
        // wstr : 表示中の Text Data
        public void bytEdit(string wstr)
        {
            string[] ws;
            ws= wstr.Split(new char[] {'\n'});
            for(int i=0; i<ws.GetLength(0)-1; i++)
                hexMode(ws[i], i);
        }
    
  4. class Edit の hexMode() 関数です。
    Text Box の一行分のデータは、例えば次のように渡されます。
    0038: 2A000526 20004200 69006E00 61007200  ...
    
    修正に必要なデータは16進数表示の部分(7文字目から35文字分)です。
    連続する2個の空白が検出されると、行編集の終わりと判断します。
    16進数の2桁を取り出して hex2byte() 関数で byte に変換します。
        // byt[256] の行(line)の文字を hex で更新
        public void hexMode(string ws, int line)
        {   int     i,j;
            Console.WriteLine("Len={0} ws={1}", ws.Length,ws);
            j = 0;
            for(i=6; i<42; )
            {
                if (ws[i]==' ' && ws[i+1]==' ') return;
                if (ws[i]==' ')
                {
                    i++;
                    continue;
                }
                byt[line*16+j] = hex2byte(ws.Substring(i,2));
                i += 2;
                j++;
                if (j>=16) return;
            }
        }
    
  5. 16進数の2桁を byte に変換する hexMode() 関数です。
    0~9の数字とA~Fの英字を分けて処理します。
        // 2文字の16進数を byte に変換
        public byte hex2byte(string str)
        {   byte wk;
    
            if (str[0] <= '9') wk = (byte)((str[0] & 0x0F)<<4);
            else wk = (byte)(((str[0] + 9) & 0x0F)<<4);
            if (str[1] <= '9') wk += (byte)(str[1] & 0x0F);
            else wk += (byte)((str[1] + 9) & 0x0F);
            return wk;
        }
    
  6. これで16進数による修正機能がサポートされました。
    後は修正されたバッファをファイルに上書きすれば Binary Editor の完成です。

[Next Chapter ↓] ベータ版の完成です
[Previous Chapter ↑] 入出力と描画の制御

超初心者のプログラム入門(C# Frame Work)