BinaryEditor:用ListView实现编辑二进制文件

这是一个用ListView实现的二进制文件编辑器,支持多标签浏览。用户通过数字键盘输入0-255之间的数据,按Enter键确认。文章提供了下载链接及简单说明。

BinaryEditor下载地址:【网通】点击这里来下载吧,带源程序哦。 【电信、网通】点击此处下载源程序

【下载说明】
1、单击上面这个地址,打开下载页面。
2、点普通下载--等待30秒--点“下载”按钮--保存

闲来无事,写了一个用ListView实现编辑二进制文件的程序,并且支持多标签浏览,也算是练习TabControl了.

 


输入时需要用到数字键盘的键,完成之后按Enter键. 注意,输入的数据的大小只能在0-255之间.
主要源程序:

/*
 * Created by SharpDevelop.
 * User: PengJun

 * Date: 2012-5-9
 * Time: 12:47
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

using System.IO;
using System.Diagnostics;

namespace BinaryEditor
{
 /// <summary>
 /// Description of MainForm.
 /// </summary>
 public partial class MainForm : Form
 {
  private ListViewItem.ListViewSubItem lvsi=null;
  private TextBox editTextBox=null;
  
  public MainForm()
  {
   //
   // The InitializeComponent() call is required for Windows Forms designer support.
   //
   InitializeComponent();
   
   //
   // TODO: Add constructor code after the InitializeComponent() call.
   //
   toolStripStatusLabel1.Text="";
   toolStripStatusLabel2.Text="";
  }
  
  void OpenToolStripMenuItemClick(object sender, EventArgs e)
  {
   OpenFileDialog ofd=new OpenFileDialog();
   ofd.Multiselect=true;
   if(ofd.ShowDialog()==DialogResult.OK)
   {
    for(int i=0;i<ofd.FileNames.Length;i++)
    {
     LoadFile(ofd.FileNames[i]);
    }
   }
  }
  
  void LoadFile(string filePath)
  {
   TabPage tp=new TabPage();
   ListView lv=new ListView();
   
   tp.Text=Path.GetFileName(filePath);
   lv.Anchor=AnchorStyles.Top|AnchorStyles.Bottom|AnchorStyles.Left|AnchorStyles.Right;
   lv.Location=new Point(0,0);
   lv.Size=new Size(tp.Width,tp.Height);
   lv.GridLines=true;
   lv.View=View.Details;
   lv.Name=Path.GetFileNameWithoutExtension(filePath);
   lv.MouseUp+=new MouseEventHandler(lv_MouseUp);
   lv.FullRowSelect=true;
   lv.MultiSelect=false;
   
   tp.Controls.Add(lv);
   tabControl1.TabPages.Add(tp);
   tabControl1.SelectedTab=tp;
   
   Stopwatch sw=new Stopwatch();
   sw.Start();
   using(BinaryReader br=new BinaryReader(File.Open(filePath,FileMode.Open)))
   {
    long length=br.BaseStream.Length;
    int col=0;
    int row=0;
    int no=0;
    int rows=(int)Math.Ceiling(length/256.0);
    
    ListViewItem lvi;
    ListViewItem.ListViewSubItem lvsi=new ListViewItem.ListViewSubItem();
    
    for(int i=0;i<256;i++)
    {
     lv.Columns.Add(i.ToString(),40,HorizontalAlignment.Center);
    }
    
    for(int i=0;i<rows;i++)
    {
     lvi=new ListViewItem();
     lvi.Text=i.ToString();
     lv.Items.Add(lvi);
    }
    
    lv.BeginUpdate();
    while(no<length)
    {
     no++;

     byte b=br.ReadByte();

     lvsi.Text=b.ToString();
     lv.Items[row].SubItems.Add(lvsi);
     lvsi=new ListViewItem.ListViewSubItem();

     col++;
     
     if(col==256)
     {
      row++;
      col=0;
     }
     
    }
    lv.EndUpdate();
   }
   sw.Stop();
   
   toolStripStatusLabel1.Text=sw.ElapsedMilliseconds.ToString()+"ms";
  }

  void lv_MouseUp(object sender, MouseEventArgs e)
  {
   TabPage currentTabPage=tabControl1.SelectedTab;
   string listViewName=currentTabPage.Text.Substring(0,currentTabPage.Text.Length-4);
   ListView currentListView=(ListView)currentTabPage.Controls.Find(listViewName,false)[0];
   
   //delete the old text box
   if(this.editTextBox!=null)
   {
    currentListView.Controls.Remove(this.editTextBox);
    this.editTextBox=null;
   }
   
   ListViewItem lvi=currentListView.GetItemAt(e.X,e.Y);
   ListViewItem.ListViewSubItem lvsi=lvi.GetSubItemAt(e.X,e.Y);
   int nColIndex=lvi.SubItems.IndexOf(lvsi);
   int nRowIndex=currentListView.SelectedIndices[0];
   
   toolStripStatusLabel2.Text="("+nRowIndex.ToString()+","+nColIndex.ToString()+")";
   
   TextBox editTextBox=new TextBox();
   editTextBox.Text=lvsi.Text;
   editTextBox.Location=new Point(lvsi.Bounds.Left,lvsi.Bounds.Top);
   editTextBox.Size=new Size(lvsi.Bounds.Width,lvsi.Bounds.Height);
   editTextBox.Visible=true;
   editTextBox.KeyUp+=new KeyEventHandler(editTextBox_KeyUp);
   currentListView.Controls.Add(editTextBox);
   
   this.lvsi=lvsi;
   this.editTextBox=editTextBox;
   
   editTextBox.Focus();
   editTextBox.Select(0,editTextBox.Text.Length);
  }

  void editTextBox_KeyUp(object sender, KeyEventArgs e)
  {
   if(e.KeyCode==Keys.Enter)
   {   
    TabPage currentTabPage=tabControl1.SelectedTab;
    string listViewName=currentTabPage.Text.Substring(0,currentTabPage.Text.Length-4);
    ListView currentListView=(ListView)currentTabPage.Controls.Find(listViewName,false)[0];
    
    try
    {
     byte b=byte.Parse(this.editTextBox.Text);
     this.lvsi.Text=b.ToString();
     
     currentListView.Controls.Remove(this.editTextBox);
     this.editTextBox=null;
    }
    catch(Exception ex)
    {
     currentListView.Controls.Remove(this.editTextBox);
     this.editTextBox=null;
     MessageBox.Show(ex.Message,"Exception");
    }
    
    return;
   }
   
   if(!(e.KeyCode>= Keys.NumPad0 && e.KeyCode<=Keys.NumPad9))
   {
    MessageBox.Show("Must use the numeric pad 0~9.","Info");
   }
  }
  
  void CloseCurrentTabToolStripMenuItemClick(object sender, EventArgs e)
  {
   int selectIndex=tabControl1.SelectedIndex;
   tabControl1.TabPages.Remove(tabControl1.SelectedTab);
   tabControl1.SelectedIndex=selectIndex-1;
   
   GC.Collect();
  }
  
  void ExitToolStripMenuItemClick(object sender, EventArgs e)
  {
   Close();
  }
  
  void SaveToolStripMenuItemClick(object sender, EventArgs e)
  {
   SaveFileDialog sfd=new SaveFileDialog();
   
   if(sfd.ShowDialog()==DialogResult.OK)
   {
    using(BinaryWriter bw=new BinaryWriter(File.OpenWrite(sfd.FileName)))
    {
     TabPage currentTabPage=tabControl1.SelectedTab;
     string listViewName=currentTabPage.Text.Substring(0,currentTabPage.Text.Length-4);
     ListView currentListView=(ListView)currentTabPage.Controls.Find(listViewName,false)[0];
     
     for(int i=0;i<currentListView.Items.Count;i++)
     {
      for(int j=1;j<currentListView.Items[i].SubItems.Count;j++)
      {
       string text=currentListView.Items[i].SubItems[j].Text;
       byte b=Convert.ToByte(text);
       bw.Write(b);
      }
     }
    }
    
    MessageBox.Show("Save Completely!","Info.");
   }
  }
 }
}

【更多阅读】

  1. [原]WMICodeCreator:C#产生WMI代码的工具
  2. [原]ManageStartUpApps:C#操作注册表来读取和修改开机启动项
  3. [原]Cls_Ini.cls:VB写的操作ini配置文件的类
  4. [原]Hotkey.cs:为应用程序添加热键
  5. [原]QQHelper:QQ大家来找茬 辅助工具 外挂
  6. [原]GetIcons:C#提取应用程序的图标资源
  7. [原]DownloadWebImages:下载某页面上的所有图片
  8. [原]QQHelper:QQ大家来找茬 辅助工具 外挂
  9. [译]用C#检测你的打印机是否连接
  10. [原]BinaryEditor:用ListView实现编辑二进制文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值