如何在Winforms应用程序内创建十六进制编辑器

时间:2018-11-21 10:45:50

标签: c# winforms

我还是很困惑使用什么更好的东西,datagridview或Be.HexEditor, 我很确定我可以使用datagridview做到这一点,但是我更喜欢be.hex,尤其是速度,UI等...

但是我试图理解be.hex的代码,我无法弄清楚它是如何工作的,并且有可能将字节数组中的值显示给HexBox(不仅是从打开{{1}开始) }文件)。它也使用.bin,并且网上也没有关于此类的信息。

dynamicFileByteProvider

我的应用程序将最多打开1024个字节的文件,并且还将从通讯端口读取字节

2 个答案:

答案 0 :(得分:0)

我对此做了些修改。我所做的是

1)在窗体上放置一个不可见的图片框作为控件占位符,此处命名为ph1

2)在Form_Load()中配置HexBox控件

private HexBox hexBox;

private void Form1_Load(object sender, EventArgs e)
{
    hexBox = new HexBox()
    {
        Top = ph1.Top,
        Width = ph1.Width,
        Height = ph1.Height,
        Left = ph1.Left,
        Visible = true,
        UseFixedBytesPerLine = true,
        BytesPerLine = 16,
        ColumnInfoVisible = true,
        LineInfoVisible = true,
        StringViewVisible = true,
        VScrollBarVisible = true
    };
    this.Controls.Add(hexBox);
    this.Controls.Remove(ph1);
}

3)在DragDrop事件中加载实际文件

var filePath = ((string[])(e.Data.GetData(DataFormats.FileDrop)))[0];
var source = new FileByteProvider(filePath);
hexBox.ByteProvider = source;
hexBox.Refresh();

将docx文件拖放到表单后的示例:

enter image description here

编辑:如果您希望提供一些自行生成的字节数组,就这么简单:

byte[] byteArr = {0xaa, 0x3f, 0x4b};
hexBox.ByteProvider = new DynamicByteProvider(byteArr);

编辑2:保存十六进制框的内容: 我相信有更好的方法可以做到这一点。我现在发现的只是在十六进制框定义块中添加一个处理程序:

hexBox.CopiedHex += HexBox_CopiedHex;

具有这样的代码的某种“保存”按钮:

private void button1_Click(object sender, EventArgs e)
{
    hexBox.SelectAll();
    hexBox.CopyHex();
    hexBox.SelectionLength = 0;
}

还有这样的事件处理程序:

private void HexBox_CopiedHex(object sender, EventArgs e)
{
    var hex = Clipboard.GetText();
    var hexHex = hex.Split(' ');
    var hexArr = new byte[hexHex.Length];
    for (var i = 0; i < hexHex.Length; i++)
    {
        hexArr[i] = byte.Parse(hexHex[i], NumberStyles.AllowHexSpecifier);
    }
    File.WriteAllBytes(@"C:\00_Work\test.bin", hexArr);
}

答案 1 :(得分:0)

要在十六进制框中显示byte [],请使用new DynamicByteProvider(byte[]

要从hexbox中获取修改的字节[] 使用DynamicByteProvider.Bytes.ToArray()