HexEdit - Windows 二进制文件编辑器






4.96/5 (134投票s)
开源十六进制编辑器,带有强大的二进制模板
引言
在去年一直处于测试版之后,我终于发布了 HexEdit 4.0 的正式版本。测试版运行良好,所以我一直没有急于发布它。不过,确实进行了一些小错误修复。
HexEdit 使用 C++ 编写,此版本需要 VS2008(带功能包)、VS2010 或更高版本提供的 MFC。编译应该不难,但如果遇到任何问题,请参阅下面的“构建 HexEdit 4.0”部分。现在还为 VS2012(Visual Studio 11)提供了项目文件。
HexEdit 的第一个版本(1999 年)是开源的,但后来的版本是共享软件(尽管我一直维护着一个免费版本)。由于 HexEdit 2.0 使用商业 BCG 库,因此将其开源的意义不大(BCG 库是一个出色的 MFC 扩展库,所以我并不后悔使用它)。幸运的是,几年前微软收购了 BCG 代码并将其整合到 MFC 中。因此,HexEdit 4.0 现在再次开源(参见 http://www.hexedit.com);还有一个共享软件版本可供那些愿意付费的用户使用(参见 http://www.hexeditpro.com),其中包含一些小的附加功能。
要构建 HexEdit 4.0,您只需要 Visual Studio,以及一些开源代码和库(其中大部分都来自 CodeProject)。只要您遵守相对不严格的许可要求(见下文)或任何包含的第三方代码的特定要求,您就可以随意使用该程序或任何源代码。
开发历史
我在 1997-1998 年编写了 HexEdit,因为当时我工作中需要它,而当时可用的十六进制编辑器很糟糕。HexEdit 一直被设计为易于使用,并且对于 MS Word 和 Visual Studio 等 Windows 软件的用户来说很熟悉。事实上,它借鉴了这些以及其他常用 Windows 程序的许多想法。
HexEdit 1.0
1999 年 1 月,我向公众发布了 HexEdit 1.0 及其源代码,并收到了大量积极反馈。有些人甚至写邮件询问如何付费!第一个版本的一些赞誉功能包括无限撤销(不仅仅是文件更改)、文件大小可编辑且不限于内存大小、EBCDIC 支持、简单(但快速)的搜索和文件比较、键盘宏。最有用的功能是浮动的“属性”窗口,它可以显示有关活动文件中当前光标位置的字节的各种有趣信息。
当时我有一个我想添加的东西的巨大列表——有些是用户建议,但主要是我自己的想法。我决定制作一个共享软件版本,这样我就会有一些动力继续添加功能,并且可以证明我花费了大量时间在这上面。
当时我的待办事项列表中的一些内容是
- 颜色方案(包括不同字节范围的颜色)
- 高亮显示(类似于 MS Word 中的)
- 打印(类似于 MS Word)
- 书签(类似于 Visual Studio 中的,但更好)
- 后台搜索(在后台线程中自动查找当前搜索字符串的所有出现)
- 高级模板(包括表达式、可选部分、循环等)
- C/C++ 解析器,可以从 C 结构体(或 C++ 类)创建基本模板
- 俯视视图(使用上述颜色方案)
- 改进的比较,包括插入/删除
- 更好的搜索,包括数字搜索、对齐限制等
- 磁盘编辑器和内存编辑器
- 标尺(带有 Word 中那样的可拖动句柄)
- 键盘和工具栏自定义
该列表中的唯一遗留项目是更好的文件比较实用工具和内存编辑器。我过去实际上实现过这两个功能,但它们的质量不足以添加到已发布的版本中。
HexEdit 2.0
2001 年,我发布了 HexEdit 2.0(共享软件),它使用了非常棒的 BCG 库。我主要想要 BCG 是为了工具栏/键盘自定义,但它还有其他几个非常有用的功能,使我能够添加类似于 MS Office 和 Visual Studio 的功能。不幸的是,使用这个商业库意味着用户无法再轻松使用 HexEdit 免费版本的源代码。我一直提供早期版本(比共享软件版本落后约 2-3 年)的免费源代码(可根据要求提供)。
在这些年里,我添加了上面提到的绝大多数功能,还有更多(但我的待办事项列表比以往任何时候都长!)。我不会再在这里详细介绍历史——下一节将介绍当前版本的主要功能,但有关详细信息,您可以访问 http://www.hexedit.com/hex-edit-features.htm。
HexEdit 2.5
这是一个重要的版本,因为它引入了模板系统,包括完整的模板编辑。
HexEdit 3.0
在此版本中重写了显示引擎,从而能够实现更改跟踪、“堆叠”显示模式、扇区显示等新功能。这还提高了显示速度,特别是对于长行。最大行长度增加到 32,767。
HexEdit 4.0
在此版本的 HexEdit 中,我将代码从使用 BCG 转换为使用 MFC9。我从 2009 年初开始这项工作,花费的时间比预期长。部分原因是,我已经将无模式对话框转换为使用新的对接系统——就像 Visual Studio 中那样,您可以将多个窗口堆叠在一起,并且会自动添加选项卡。可对接窗口包括属性对话框、查找对话框、计算器、书签对话框和资源管理器窗口。
特点
HexEdit 具有非常多的有用功能,我在此只能简要提及。有关详细信息,请参阅 http://www.hexedit.com/hex-edit-features.htm 或帮助中的“功能概述”。这里我将只解释 HexEdit 设计的总体理念,并介绍一些功能作为示例。
请记住,如果您需要某个功能,它可能已经存在。我经常收到要求某个特定功能的电子邮件,而该功能已存在。请尝试在帮助中查找。
另一件事要记住的是,如果您经常发现自己花费大量时间执行一项繁琐或重复的任务,那么 HexEdit 中很可能有一个功能可以节省您的时间。我收到的另一种类型的电子邮件是来自用户说他们找到了一个他们甚至不知道自己需要但后来节省了他们大量时间的有用功能。
简单
一个首要原则是保持用户界面尽可能简单和整洁。其他十六进制编辑器的一个常见缺点是它们假设用户是高级用户,每天都使用该程序,菜单里挤满了很少使用的功能。
这就是为什么菜单很短(除了“操作”菜单有很多类似的项目),并且每个选项页面不超过 10 个选项。
这样做的目的是使用户界面不那么令人不知所措。一个不经常使用的用户(十六进制编辑器的用户通常如此)可以在不经常查阅帮助的情况下使用该程序。当然,如果您需要,还有大量的帮助可供使用。
标记
标记是一个简单的功能,允许您在文件中标记一个位置并在以后返回到该位置。它在许多其他领域也很有用,例如键盘宏。我想我这个想法来自我使用的一个文本编辑器(pEdit、Epsilon 或 Emacs)。
帮助
保持用户界面简单的挑战之一是,一些更强大的功能可能不明显。这就是 HexEdit 在提供的帮助(快速入门、概述、参考、教程等)以及工具提示、每日提示甚至视频教程(参见 http://www.hexedit.com/videos.htm)中提供广泛帮助的原因。
熟悉
在适用的情况下,我试图模仿其他 Windows 程序中的常见行为。例如,许多十六进制编辑器使用 Tab 键在十六进制和字符区域之间切换。
对于光标键、鼠标等的行为,也存在一个事实上的标准,就像在许多编辑器中看到的。此外,您可以通过按住 Shift 键并使用光标键来选择多个字节——例如,Shift+Ctrl+End 选择到文件末尾的所有字节。
HexEdit 通常具有与 Word 和 Visual Studio 等常用 Microsoft 程序相似的行为。这是因为 Microsoft 显然进行了大量研究以确保其软件易于使用——所以这可能是一个好的行为(尽管我还没有遇到过喜欢 Ribbon 栏的人)。此外,许多用户已经熟悉这些程序,因此他们应该会感到宾至如归。以下是一些示例
高亮显示
高亮显示器的工作方式与 MS Word 中的高亮显示器相同。
打印
您可以设置页边距、页眉/页脚等,与 MS Word 非常相似。
书签
书签基于 Developer Studio(Visual Studio 的前身)的书签,并有所改进。有趣的是,Visual Studio 后来复制了 HexEdit 中首次出现的一些功能,例如浮动/可对接的书签窗口。
有用
简单性的一部分是有用的功能,无需进一步努力即可获得。
后台搜索
每当您执行搜索时,HexEdit 都会自动在后台线程中搜索文件中的其余部分(以及所有其他打开的文件)。这不会干扰您的编辑,因为后台搜索以低优先级线程运行。后台搜索完成后,您可以立即以特殊颜色高亮显示所有匹配项。
除非您处理非常大的文件,否则后台搜索通常会在您注意到之前完成——但当它运行时,进度会显示在后台搜索出现项窗格中。完成后,将显示出现次数的计数。状态栏窗格。
大文件
HexEdit 始终可以轻松编辑任何大小的文件,而无需用户付出额外的努力。在 HexEdit 之前,大多数十六进制编辑器无法编辑大于其能加载到内存中的文件。此后,许多编辑器都模仿了 HexEdit 的工作方式。
HexEdit 是第一个允许编辑大于 4 GByte(2^32 字节)大小文件的二进制编辑器。自第一个版本以来,HexEdit 已经进行了几次改进,因此您现在可以将大文件插入到其他文件中等。对选区的操作(包括压缩、加密、校验和、CRC 等)都适用于任意大小的选区。进度显示在状态栏中,当然,您可以通过按空格键或 Escape 键来中止操作。
可定制
配置 HexEdit 的能力一直很重要。用户应该能够决定他们想要如何工作。
工具栏
在 HexEdit 2.0 中,我集成了 BCG 库,该库(除其他外)允许完全自定义工具栏、键盘、菜单(包括许多上下文菜单)等。
信息提示
许多程序在您将鼠标悬停在感兴趣的项目上时会显示一个小(通常是黄色)提示窗口。HexEdit 通过信息提示进一步扩展了这一点。
在二进制编辑器中,您对文件中的某些字节感兴趣的内容可能与其他人不同,并且可能会因环境而异。信息提示允许您基于几个预定义的(地址、偏移量、文件数据等)值,使用类似 C 的表达式和多种格式选项来创建一到多个提示。
您可以对地址进行计算。例如,当前扇区的偏移量是否能被三整除?
您可以使用数十种不同的格式(浮点数、日期等)检查鼠标位置的数据。例如,根据第 6 位是开启还是关闭,显示“是”或“否”,或者检查当前 IBM 浮点数是否为负数。
文件过滤器列表
当您打开或保存文件时,大多数程序会在标准文件打开/保存对话框的“文件类型”下拉列表中显示一个“过滤器”列表,其中包含程序已知的各种文件类型。由于 HexEdit 允许您处理任何类型的文件,因此您可以根据需要自定义此过滤器列表。
您可以在“选项”对话框的“文件类型过滤器”页面中添加或删除过滤器。由于您可能在不同时间处理不同类型的文件,因此您可以使用复选框来打开或关闭过滤器,而无需删除它们。
此外,相同的过滤器列表在“HexEdit 资源管理器”窗口中也可用。这允许您过滤您看到的文件列表。这是功能集成(见下文)的另一个示例。
兼容
HexEdit 的用户界面不仅与其他程序兼容,它还努力与其他软件良好配合。
剪贴板
在使用剪贴板时,HexEdit 支持文本数据和二进制数据。二进制数据格式与 Visual Studio 十六进制编辑器使用的格式完全相同。
“复制为 C 源”对话框允许以多种不同的文本格式复制到剪贴板,适用于初始化 C、C++、C# 和其他语言中的字符串和数组。事实上,整数和浮点数选项与许多程序(如电子表格)使用的 CSV(逗号分隔值)格式兼容。
导入/导出
您可以导入/导出 Motorola-S 和 Intel-hex 格式。这些格式被许多设备(如 EPROM 编程器)使用。HexEdit 包含许多很棒的功能,例如对非连续记录的支持。
您还可以使用十六进制文本导入和导出,其中每个字节存储为 ASCII 中的 2 个十六进制数字。对于 CSV 格式,请使用“复制为 C 源”对话框(参见上文)。
灵活
许多用户评论 HexEdit 的一点是,它提供了一套简单的工具,可以轻松执行各种任务。
跳转工具
在“编辑”工具栏上有两个简单的下拉列表,提供了大量功能。这些是十六进制和十进制跳转工具。它们的主要目的是让您输入一个地址即可立即跳转到该地址。下拉列表提供了最近跳转到的地址的历史记录。
但它们的作用远不止于此。首先,当您在文件中移动光标时,它们会更新为显示当前地址。要记住一个地址(通过将其添加到历史记录),只需单击该工具并按 Enter 键即可。
另一个特点是,当您在一个工具中键入值时,另一个工具中会显示相应的值。这允许在十六进制和十进制之间进行快速便捷的转换。
最后,您可以在这些工具中评估任何表达式,包括赋值给在会话之间存储的变量。(有关 HexEdit 中表达式的更多信息,请参见下文。)当您在跳转工具中键入表达式时,结果会显示在其他可见的跳转工具中。(您可以将任意数量的跳转工具设为可见,方法是自定义工具栏。)
键盘宏
有时我会收到一个功能的请求,我不得不说“不”,因为它太特殊了,不适合普遍使用。即使如此,大多数时候我都可以简单地指出如何通过使用现有的工具或工具的组合来实现该功能。
键盘宏提供了最灵活的功能之一。计算器按钮尤其有用,因为它们都已记录并存储在键盘宏中。许多用户没有意识到宏可以在文件之间工作,因此您可以复制文件的一部分并将其粘贴到临时文件中进行进一步操作。
宏也可以调用其他宏。这在 HexEdit 分发的“AllChars”宏中得到了演示,该宏创建一个新文件并用所有 256 种不同的字节值填充它。
集成
HexEdit 灵活性的一个方面是,有许多简单的工具被设计成协同工作。上面提到的一个例子是计算器按钮如何在键盘宏中使用。这里还有一些例子
颜色方案
颜色方案有助于设置其他功能使用的颜色,例如书签、搜索匹配项、更改跟踪等。
颜色方案一个非常有用的功能是能够为字节值范围显示颜色。例如,在默认的 ASCII 颜色方案中,普通文本是蓝色的,而控制字符是红色的,但文本文件中通常找到的控制字符(制表符、回车符等)是绿色的。
颜色方案的使用也对于与俯视视图功能结合使用至关重要。如果您对特定的字节值感兴趣,可以创建一个颜色方案来在俯视视图中显示该值或值范围。
如果您不知道文件格式,可以使用“彩虹”颜色方案来了解文件中不同字节值的情况——这通常会立即显示出感兴趣的区域。
搜索
搜索是各种工具协同工作的另一个领域。例如,搜索工具(编辑工具栏)的历史列表与查找对话框不同页面中的搜索历史集成在一起。
另一个例子是,查找对话框可以在所有找到的匹配项处设置书签。
查找对话框还支持对齐搜索,这是一项非常有用且强大的功能。对齐可以相对于 **标记**(见上文)。
强大
属性对话框
属性对话框是一个小的浮动/可对接窗口,其中包含有关当前文件和文件中当前位置的字节的多个页面的信息。首先,当您在文件中移动光标(插入符)时,显示屏会更新以显示有关当前字节的信息。有多个页面,以便您可以看到有关整数、浮点数、日期等的信息。
模板
自从引入以来,模板系统一直是吸引最多兴趣的功能。我听说有人花了数周甚至数月来编写程序来编辑特定的文件格式。当他们发现 HexEdit 的模板时,他们通常只需几个小时的工作就能完成几乎相同的事情。
HexEdit 模板的秘密在于表达式求值器,它采用类似 C 的表达式,但可以处理更多数据类型,如日期。通过表达式,您可以分析文件中几乎任何类型的字段,并使用该字段来控制模板的求值。
表达式可用于控制分支(IF 和 SWITCH)和循环(FOR 带计数器或带终止条件)。此外,JUMPs 允许无序处理,如文件末尾的“头”。STRUCTs 可以是自引用的,因此您可以模拟递归数据结构。
模板强大功能的一个例子是,它们可以用于查看文件系统(与磁盘编辑器结合使用)以显示信息以及来自已删除文件的imerick 等数据。例如,我为 FAT12 文件系统(在 MSDOS/Windows 软盘上使用)创建了一个模板,该模板可以显示根目录中的文件,甚至可以钻取到子目录。
模板系统中最强大的部分之一是 C/C++ 解析器。有了它,您可以粘贴 C 结构体(或几乎任何 C 或 C++ 代码),然后让 HexEdit 将数据字段添加到您的模板中。该解析器支持 C 标准的所有部分(预处理器、联合、位域等)以及一些额外的功能,如 #pragma pack。
程序员导向
二进制编辑器是程序员的领域,因此许多功能都直接针对程序员。例如,表达式(在模板、计算器、跳转工具等中使用)基于 C 语言的表达式。同样,格式化(在模板、信息提示等中)基于 printf 格式说明符(或日期为 strftime 格式)。
zlib
Zlib 是数据压缩的事实标准。它提供了出色的压缩,有一个开源库(用 C 编写),并且不受专利或其他限制的约束。此外,许多编译器和运行时环境默认提供它(例如 Delphi、.Net、...)。它被用于许多文件格式和通信协议——例如,它被用于 .zip 文件中,在那里它被称为“deflate”。(Zip 文件还支持其他算法,但如今文件通常使用“deflate”进行压缩,因为它效果最好。)
多年来,我参与了几个使用 zlib 的项目。为了协助测试和调试,我添加了 zlib 压缩功能,并支持其所有选项。以前,我不得不创建一个小型测试程序来测试诸如我的数据的最佳策略或写入完整刷新点的频率等内容。现在,我只需将我的数据加载到 HexEdit 中即可测试不同的 zlib 选项。
构建 HexEdit 4.0
要构建 HexEdit,您需要下载上述 zip 文件之一或两个。首先,您需要 **项目** zip 文件。或者,您可以从 SourceForge 上的 SVN 存储库获取最新的源代码(但您可能仍需要 **extras** zip 文件中的文件)。
您很可能需要 **extras** zip 文件,其中包含构建项目所需的 FreeImage 和 boost 文件。(如果您已安装 FreeImage 和 Boost,则可能不需要这些。)它还包含一些图像“源代码”文件(PDN 格式)、帮助文件和安装程序源代码文件。
最后,您需要 Microsoft 的 **Visual Studio** 2008 或更高版本。有针对不同 VS 版本的项目文件。安装 VS 时,您需要安装 C++ 语言和 MFC DLL。我被告知您 **不能使用免费的 Visual Studio Express 版本**,因为它们不包含 MFC。
根据您想做的事情,您可能还需要一些其他(免费)工具。如果您想构建 HexEdit 安装程序 *hexed4_0.msi*,则需要 **Wix**(见下文)。如果您想编辑图形(参见 http://www.getpaint.net/),则需要 **Paint.Net**,因为“源代码”图形是 .PDN 格式的。抱歉,您目前无法更改和重新构建帮助系统,但提供了 HexEdit.CHM 文件。
HexEdit.exe
在此描述如何构建 HexEdit。
希望(在下载并解压项目和附加文件后),您只需打开适用于您使用的 Visual Studio 版本的项目,告诉编译器 Boost 和 FreeImage 的头文件和库文件的位置,然后构建 HexEdit。如果一切顺利,这将在相应的子目录中创建 HexEdit.exe,您可以运行并使用它。如果发布版本的构建结束时出现错误,您可能没有在路径中找到 *ReplaceVistaIcon.exe*——但您可以安全地忽略此错误。
您可以不使用安装程序运行 *HexEdit.exe*。它本身运行良好,但为了达到最佳效果,您需要将一些文件复制到运行 HexEdit.exe 的同一位置。即来自 Graphics 目录的三个文件(*Backgrnd.bmp*、*Splash.bmp*、*About.jpg*)和其他用于各种功能的 are:*HexEdit.tip*(每日提示)、*ebcdic.tab*(自定义 EBCDIC 转换表)、*DefaultToolbarImages.bmp*(用于工具栏图标编辑)、*BinaryFileFormat.dtd* 和 *Default.xml*(用于模板创建)、其他 XML 文件(模板)、一些 XML 和 TXT 文件(用于模板 C/C++ 解析器 - 请参阅帮助)等。
Visual Studio 2008
首先,您需要安装 MFC 功能包,因为它包含 MFC 的版本,MS 在其中添加了 BCG 代码。(它在 VS2008 发布时还不完全可用,因此被放入一个单独的功能包中。)如果您有 VS2008 但没有功能包,您可以 在此下载。
要设置 VS2008 以查找 FreeImage 和 Boost 文件,您需要添加到 **包含文件** 和 **库文件** 位置。为此,请打开“选项”对话框(工具/选项),然后转到“项目和解决方案/VC++ 目录”,然后从“显示目录用于”下拉列表中选择“包含文件”或“库文件”。
然后只需打开 *HexEditVS2008.sln* 并进行构建。
Visual Studio 2010 和 VS2012
这些版本自带所需的 MFC 版本。您无需安装 MFC 功能包。
FreeImage 和 Boost 文件的 **包含文件** 和 **库文件** 位置(用于 FreeImage 和 Boost)应该已经设置在正确的子目录中。但如果您使用的是自己的 Boost 和 FreeImage 副本,则必须自己设置这些。
只需在 VS2010 中打开 *HexEditVS2010.sln*(或在 VS2012 中打开 *HexEditVS2012.sln*)并进行构建。
MSXML.DLL 3.0
当我开始从事模板系统的工作时,我热衷于使模板文件的格式尽可能开放,并且还使用文本(而不是二进制)格式(希望其他人也能支持该格式)。我刚刚读到 XML,这似乎是模板文件的理想格式。此外,使用合适的 DTD 将为我节省大量用于解析任何文本文件以确保其符合正确格式的工作。大约在这个时候,微软发布了 IE5(Internet Explorer 5.0),其中包括 XML SDK(MSXML.DLL),因此使用它很简单。
如今,原始的 MSXML.DLL 已不再受支持,也不会与 Windows 或 IE 一起分发。MS 仍支持的最旧 XML SDK 版本是 MSXML3.DLL,因此我刚刚将 HexEdit 转换为使用它(使用 MSXML2 命名空间)。我相信 MSXML3.DLL 是随 Windows 7、Vista 和 XP 分发的。如果您使用的是 W2K(Windows 2000),您将需要安装 SP4 或 IE6。
FreeImage 3.10
FreeImage 子目录中有三个文件,分别是 HexEdit 编译(*FreeImage.h*)、链接(*FreeImage.lib*)和运行(*FreeImage.DLL*)所必需的。您可以将这些文件复制到一个编译器可以找到的现有位置,或者将子目录添加到编译器的 **包含** 文件和 **库** 文件位置。
我通常只是将 *FreeImage.DLL* 复制到 Windows 系统目录(通常是 *C:\Windows\system32*),这样在运行 HexEdit 时它始终会被找到。当然,您应该小心不要用提供的版本(3.10)覆盖新版本的 DLL。如果您已经安装了更新版本的 FreeImage,那么 HexEdit 应该兼容,但如果遇到任何问题,请联系我。
如果您想从源代码重新构建 FreeImage,或下载文档,或链接到最新版本等,请参阅网站 http://freeimage.sourceforge.net/。
Boost 1.44.0
Boost 非常庞大,所以我没有包含全部内容,但我包含了构建 HexEdit 所需的所有头文件在 **boost** 子目录中。但是,由于 Boost 头文件使用 <> 来 #include 其他 Boost 头文件,您需要将 HexEdit 源目录添加到 include 目录列表中。不要添加“Boost”子目录,因为 Boost 头文件始终使用 include Boost 作为文件名的一部分(即 #include
或者,您可以下载并安装完整的 Boost 库(推荐),并将 **include** 位置设置为指向它。例如,我使用 *D:\include\boost_1_44_0*,它在 boost 子目录中包含头文件。
有关更多信息,或下载完整库,请访问 https://boost.ac.cn/。
帮助
目前 HexEdit 帮助文件是使用商业 RoboHelp 产品构建的,所以我没有包含帮助系统的源代码,而是只包含 HTML 帮助文件(*HexEdit.chm*)。我还创建了一个 Web 版本的帮助系统,通常可以在 http://www.hexedit.com/help/Hexedit.htm 找到,尽管它没有集成到 HexEdit 中,因此不包含诸如上下文相关帮助之类的内容。
ReplaceVistaIcon
另一个可选步骤是替换默认的 HexEdit 图标,使其在 Vista 和 Windows 7 上看起来更好。在 **res** 子目录中有一个名为 *hexedit2.ico* 的文件,它是 Windows 图标文件,尺寸最大为 48x48,具有 8 位和 32 位分辨率。由于 Visual Studio 不能很好地处理此类图标,我使用了第三方商业图标编辑器(参见 Real World Icon Editor)来创建此文件。
要将此图标添加到 *HexEdit.exe*,必须使用一个名为 ReplaceVistaIcon.exe 的程序。(参见 https://codeproject.org.cn/KB/GDI/using_vista_icons.aspx)这在批处理文件 *HexEditPostBuild.bat* 的后期构建事件中完成。
您需要从 CodeProject 下载 exe(参见 https://codeproject.org.cn/KB/GDI/using_vista_icons.aspx),但这是可选的,因为 .exe 也可以使用较低质量的图标正常工作。一旦您有了 *ReplaceVistaIcon.exe*,您就需要将其放在您的 PATH 中或批处理文件可以找到它的位置。
安装程序
此版本的 HexEdit 使用开源 WIX 安装程序。我选择 WIX 是因为它是我想要的唯一免费的 MSI 文件(MicroSoft Installer 文件)安装程序,并且具有我需要的功能。虽然它非常灵活,但除非您非常熟悉 Windows Installer 的工作方式,否则使用起来很困难。参见 http://wix.sourceforge.net/。
要构建安装程序,您需要下载并安装 WIX(我使用的是 2.0 版本)。在 HexEdit 的 **Install** 目录中,您需要编辑 *make.bat* 和 *wixui\makelib.bat*,将 *D:\Program Files\wix* 的所有出现项更改为您安装 WIX 的目录。
当然,您必须构建 HexEdit 的 **发布** 配置。您还需要 CRT(C 运行时)和 MFC DLL 的合并模块。如果您在安装 Visual Studio 时没有安装合并模块,则现在需要安装它们。(或者,您可以从 *HexEdit.wxs* 中删除合并模块行,但这样 HexEdit 将无法在没有已安装这些 DLL 的系统上运行。)
控制安装的主要文件是 *HexEdit.wxs*(一个 XML 文件)。如果您以非标准位置安装了 Visual Studio 或 WIX 等,您可能需要更改批处理文件和 *HexEdit.wxs*。如果您使用 VS2008 或 VS2012(而不是 VS2010)构建的 *HexEdit.exe*,那么您还需要编辑 *HexEdit.wxs* 来更改 *HexEdit.exe* 的查找位置(将“ReleaseVS2010”更改为“ReleaseVS2008”或“ReleaseVS2012”),以及 MS 合并模块的名称(在合并模块名称中将“100”更改为“90”)。
当一切设置正确后,只需运行 *wixui\makelib.bat* 然后运行 *make.bat* 即可创建 Microsoft Install 文件(*HexEd4_0.msi*)。
设计和代码
软件设计的一些区域很差(原因各不相同),但其他部分非常出色。整体设计符合 MFC 设计模式(包括经典的 MFC 文档-视图模型,它类似于 MVC,但结合了视图和控制器)。`CHexEditView` 和 `CHexEditDoc` 类通过实现文档-视图模型的视图和文档,提供了 HexEdit 的核心。
核心部分是处理大文件并跟踪更改(在内存和临时磁盘文件中)的能力。这一切都在 `CHexEditDoc` 类中处理(参见 *DocData.cpp*)。另一个重要部分是文件(和编辑)的显示,这主要由 `CScrView` 处理,它派生自 MFC 的 `CView`,并且是 `CHexEditView` 的基类。它处理 X 方向最多 2^60 像素,Y 方向最多 2^32 像素的显示,包括标尺、滚动条、滚动条等。
代码中有很多注释,包括一些源文件开头的详细设计说明。除此之外,我认为给出代码概述的最佳方法是解释每个文件的内容。
我将仅列出头文件(.h)文件,因为 .cpp 文件通常与其对应的 .h 文件同名。例如,`CHexEditDoc` 类实现在 *HexEditDoc.cpp* 以及从其拆分出来的其他几个文件中。通常每个头文件包含一个类,也许还有相关的结构或类。有一些例外情况,如下所述。
HexEdit.h - `CHexEditApp` 类,用于唯一的应用程序对象
Stdafx.h - 用于构建预编译头
resource.h - *HexEdit.rc* 和 C++ 代码中使用的资源 ID
MainFrm.h - 处理应用程序主窗口的 MFC 派生类
ChildFrm.h - 处理每个文件“窗口”的 MFC 派生类
HexEditDoc.h - `CHexEditDoc` 类(参见 *HexEditDoc.cpp*、*DocData.cpp*、*Template.cpp*、*BGSearch.cpp*、*BGAerial.cpp*)。
HexEditView.h - `CHexEditView` 类(参见 *HexEditView.cpp* 和 *Printer.cpp*)
ScrView.h - `CScrView` 提供可滚动视图(`CHexEditView` 的基类)
DataFormatView.h - `CDataFormatView` 处理模板显示(另请参阅 *Template.cpp*)
AerialView.h - `CAerialView` 类 - 显示俯视视图(也请参阅 *BGAerial.cpp*)
Prop.h - 包含属性对话框的类(属性表、属性页和控件)
BookMarkDlg.h - `CBookMarkDlg` 对话框类,用于查看/添加书签(另请参阅 *bookmark.h*)
FindDlg.h - 查找对话框的类(属性表和页面)
Explorer.h - `HexEdit` 资源管理器对话框(对话框和控件类)
CalcDlg.h - `CCalcDlg` 类,用于计算器(另请参阅下面的 *CalcEdit.h*)
Options.h - 选项对话框的属性表和页面
DFFD*.h - 用于模板编辑的对话框
TParseDlg.h - 模板编辑中使用的 C/C++ 解析对话框(参见 *TParse.h*)
NewFile.h - 用于“新建文件”和“插入块”命令的对话框
OpenSpecialDlg.h - 特殊打开对话框,用于磁盘编辑等(也请参阅 *SpecialList.h*)
RecentFileDlg.h - 显示最近使用的文件对话框(也请参阅 *HexFileList.h*)
CopyCSrc.h - `CCopyCSrc` 对话框,用于“复制为 C 源”
Algorithm.h - `CAlgorithm` 类,用于加密算法对话框
Password.h - `CPassword` 类,用于加密密码对话框
CompressDlg.h - zlib 压缩对话框
EmailDlg.h - 电子邮件支持对话框
Tipdlg.h - 显示每日提示
Dialog.h - 在宏中使用(`GetStr` `CMacroMessage` `CSaveMessage` `CMultiplay`)
- 还有 `CFileDialog` 派生类,包括 `CHexFileDialog`(见下文)
HexPrintDialog.h - 自定义打印对话框(重写 MFC 的 `CPrintDialog`)
SaveDffd.h - 当模板未保存时显示的对话框(保存/另存为/取消)
NewScheme.h - 创建新颜色方案时使用的小对话框
BookmarkFind.h - 在为找到的匹配项添加书签时被查找对话框使用
DirDialog.h - 目录选择对话框(见下文)
Splasher.h - `CSplashWnd` 用于启动画面(见下文)
TipWnd.h - `CWnd` 派生类,用于显示一个小“提示”窗口(见下文)
TransparentListBox.h, TransparentStatic2.h - 透明控件(见下文)
CCalcEdit.h - `CCalcEdit` 类,处理计算器编辑框
control.h - 在对话框和工具栏上使用的各种文本和组合框控件
GenDockablePane.h - 可对接窗口,用于使计算器、查找对话框等可对接
ResizeCtrl.h - `CResizeCtrl`(见下文)
BCGMisc.h - 几个从 BCG(现为 MFC)类派生的类
UserTool.h - `CHexEditUserTool` 派生自 `CUserTool`,允许为用户工具进行命令行替换
SimpleSplitter.h - `CSimpleSplitter` 用于资源管理器对话框中的文件夹/文件部分之间的分隔
HexEditSplitter.h - `CHexEditSplitter` 允许在拆分窗口中显示俯视/模板视图
TabView.h - `CHexTabView`(派生自 `CTabView`,允许在选项卡中显示俯视/模板视图)
CoordAp.h - `CPointAp` `CSizeAp` `CRectAp`(见下文),用于 64 位(垂直)坐标系
TParser.h - `TParseDlg` 使用的 C/C++ 代码解析器(参见上面的 *TParseDlg.h*)
HexEditMacro.h - 处理键盘宏的录制和回放
HexFileList.h - 存储所有最近使用的文件的全局列表
SpecialList.h - 存储有关系统中卷和原始磁盘的信息
Bookmark.h - `CBookmarkList` 类,用于全局存储书签
Scheme.h - `CScheme` 存储所有颜色方案
NavManager.h - 导航点的全局存储
SystemSound.h - `CSystemSound` 包含用于获取、设置、播放声音的静态方法(见下文)
Timer.h - `timer` 类可以对事件进行计时(见下文)
UpdateChecker.h - 通过 Internet 检查 HexEdit 的最新版本(见下文)
Xmltree.h - MS XML SDK 的包装器(见下文)
BigInter.h - `BigInteger` 类,用于处理大于 64 位的数字
CFile64.h - `CFile64` 类,用于 64 位文件访问(见下文)
crypto.h - `CCrypto` 类包装了部分 Crypto API(见下文)
Boyer.h - boyer 类用于搜索(见下文)
range_set.h - 范围集合的模板类(见下文)
Expr.h - `expr_eval` 类处理类似 C 的表达式(用于模板等)
IntelHex.h - `CReadIntelHex` 和 `CWriteIntelHex`(见下文)
SRecord.h - `CReadSRecord` 和 `CWriteSRecord`(见下文)
misc.h - 杂项全局函数(见下文)
md5.h - 生成 MD5 校验和的例程
ntapi.h - 用于直接访问 NT API(绕过 Windows)以用于磁盘编辑器的声明
w2k_def.h - 更多 NT(非 9X)信息 - 由 *ntapi.h* 包含
optypes.h - 定义一元和二元运算(用于计算器和操作菜单)
SVNRevisionTemplate.h - 由 SVN 工具使用来创建 *SVNRevision.h* **SVNRevision.h** - 仅存储 HexEdit 版本信息
值得关注的代码
HexEdit 中创建了几个类和函数,可以轻松地在其他地方使用。事实上,许多人曾发邮件请求允许使用部分代码。(我还整合了其他人的组件——这些列在后面的 **第三方代码** 部分。)
类
boyer - 实现 Boyer-Moore 算法来搜索内存块。这就是 HexEdit 的搜索如此之快的原因。多年来,它已得到增强,以支持诸如不区分大小写的搜索、对齐等选项。
timer - 用于计时测试的实用类。许多人使用或复制了它。
range_set 类 - 我最初将其编写为一个模板类,该类模拟了 STL `std::set` 类,但更有效地处理值范围,并增加了将范围输入/输出为字符串的功能。一篇关于它的文章出现在 **1999 年 6 月的 C/C++ 用户期刊** 上。从那时起,它在 HexEdit 中找到了许多用途(也被许多其他人使用),例如在颜色范围选择中(选项对话框的颜色页面)或模板 SWITCH 语句的 CASE 的匹配值范围中。
CSystemSound - 包含非常简单但有效的系统,用于定义和播放 Windows 声音,如声音控制面板小程序所示。HexEdit 使用它来播放许多声音,例如用于搜索的声音。
UpdateChecker - 简单的类,用于从 Internet 上的文本文件中读取版本号。HexEdit 使用它来进行每月更新检查。
CReadSRecord 和 CWriteSRecord - HexEdit 中用于导入和导出 Motorola-S 格式文件的类。也有类似的类用于 Intel-hex 文件。
CXmlTree - 包装 Microsoft XML SDK(基于 DOM)的类,以便于处理 XML 模板文件。它不完整,而且可以使用得更简单。
CCrypto - 包装 Microsoft Crypto API 部分的类。它用于实现加密命令。目前它只存储所有单密钥加密算法(非公钥)的信息。它还存储当前密码。
CPointAp, CRectAp, CSizeAp - 最初我使用了 MFC 的 CPoint、CRect 和 CSize 类,但这些类在坐标大小方面有限制(最初是 16 位,仍然限制为 32 位坐标)。“Ap”类支持 X 轴上的 64 位坐标,Y 轴上的 32 位坐标。这些类对于 HexEdit 视图正确显示大文件是必需的。
CDirDialog - `CFileDialog` 派生类,允许用户通过“子类化”标准的 Windows 文件打开对话框来选择目录(文件夹)。与 Windows 推荐的 `SHBrowseForFolder`(糟糕)不同,它具有许多有用功能,例如能够查看目录中的文件、粘贴完整路径名等。
CTipWnd - `CWnd` 派生类,用于显示一个小提示窗口。在 HexEdit 的各种地方使用,例如信息提示窗口。具有更改文本和背景颜色以及使窗口淡入/淡出的功能。
CFileNC - 文件处理类(派生自 `CFile64` - 见下文),用于非缓存的基于扇区的访问。根据 MSWindows 文档,这对于磁盘编辑器中使用的原始磁盘和卷读取是必需的。请注意,其他磁盘编辑器不使用非缓存文件访问,这违反了 Microsoft 的指南(但似乎有效,并且实际上使它们更快)。
CHexFileDialog - 它派生自 MFC 的 `CFileDialog` 类,是所有标准文件对话框(打开、保存等)的基类。它用于记住和恢复每个文件对话框的窗口位置。
CScrView - 这是我为 HexEdit 编写的第一个类。它派生自 MFC 的 `CView` 类,是主视图类(`CHexEditView`)的基类。我写它是为了使其类似于 `CScrollView`,我发现 `CScrollView` 有局限性。它可能设计得不好,但其他人已经在他们的软件中使用过它,并发现它很有用。
CHexEdit, CDecEdit - 覆盖 MFC `CEdit` 类(文本框)的文本控件,允许编辑十六进制和十进制数字,包括空格或逗号分隔符。
CHexEditSplitter - 重写了 MFC `CSplitterWnd`,允许在每个文件窗口中使用动态(最大固定)数量的拆分窗口。这用于允许在正常(十六进制)视图旁边的拆分窗口中显示模板和俯视视图。
函数
在 *misc.cpp* 中还定义了一些有用的全局函数。
颜色处理函数包括:`BRIGHTNESS`(宏)、`get_hls`、`get_rgb`、`tone_down`、`same_hue` 等。这些用于许多用户界面元素的显示。
数字格式化函数在用户界面的各种地方使用。`AddSpaces`/`AddCommas` 用于十六进制/十进制数字(例如,在显示地址的任何地方)。`NumScale` 用于大数字的缩写显示(例如 KByte、MByte 等)。
数字转换函数用于属性对话框的浮点数页面,用于转换 C# Decimal、IBM FP 数字和 Turbo/Delphi real48。这些非常复杂,我花费了很多工作。
日期转换函数用于日期属性页面。
多显示器例程用于使 HexEdit 在各种让其他程序感到困惑的情况下都能良好运行。函数包括:`OutsideMonitor`、`MonitorMouse`、`MonitorRect`。
第三方代码
我整合了许多代码片段到 HexEdit 中,以节省自己编写的时间。这些都是开源的,通常我已经包含了源代码。CodeProject 是一个宝贵的资源,因为下面列出的大部分代码都是 MFC 扩展,我在这里 CodeProject 上找到的(除了 zlib、FreeImage、Boost 和 CFile64 之外)。
我没有包含 FreeImage 的源代码,因为它有 10MB,但您可以从 SourceForge 下载。我也没有包含 Boost 的所有源代码,只包含了 HexEdit 使用的部分,因为它非常庞大——您可以从其网站下载完整的源代码、文档等。
我使用的安装程序(WIX)也是开源的,但我没有包含 WIX 源代码,只有构建安装所需的文件。我还使用商业帮助编译器,所以没有包含帮助系统的源代码。只包含了最终的 HexEdit.chm 文件。
据我所知,我整合到 HexEdit 中的所有代码都是开源的并且可以免费重用。如果我侵犯了任何许可条款,请给我发电子邮件,我会纠正这种情况。
Boost C++ 库 - 主要是一个由多位作者提供的庞大的模板类集合。目前我只使用 CRC 和 PRNG 功能。参见 https://boost.ac.cn/。
ZLIB 压缩库,作者:Jean-loup Gailly 和 Mark Adler - 这是一个免费的通用压缩库(提供 C 源代码),在行业中广泛使用。(我认为它是事实上的标准)。我在 HexEdit 3.2 中添加了此库,部分是为了方便我自己,因为我在其他几个项目中都使用了 ZLIB 库。压缩选项对话框提供了对所有 ZLIB 选项的完全控制。参见 http://www.zlib.net/。
FreeImage DLL,作者:Hervé Drolon 等人 - 一个出色的开源库,用于处理图像文件和内存中的图像操作。它使得 HexEdit 的俯视视图成为可能,但也被用于 HexEdit 的其他地方。它已移植到多个平台,但我们只使用他们提供的 Win32 DLL。参见 http://freeimage.sourceforge.net/。
MFC Grid Control,作者:Chris Maunder - 一个出色的网格控件,在 HexEdit 中有多个用途——例如,在选项对话框的过滤器页面和信息提示页面,最近文件对话框,以及(带有 Tree Extensions - 见下文)模板树视图。参见 https://codeproject.org.cn/kb/miscctrl/gridctrl.aspx。
MFC Grid Tree Extensions,作者:Ken Bertelson - 对 MFC 网格控件的扩展,允许其中一列充当“树形控件”。这实现了多列树形控件的效果,这对于 HexEdit 模板(树)视图是无价的。参见 https://codeproject.org.cn/kb/miscctrl/gridtreectrl.aspx。
CFile64 Class,作者:Sam Blackburn - 当我在 1999 年发布 HexEdit 1.0 的源代码时,Sam 增强了它以使用“64 位”文件访问,从而允许 HexEdit 轻松处理大于 4 GByte 的文件。(Windows 支持 64 位文件定位,但 MFC CFile 类只允许 32 位文件地址)。Sam 的 CFile64 类(经过修改后整合到 HexEdit 中)只是他 WFC 库提供的众多有用(非 UI)类之一。(网站不再可用。)
Window Splitter 类,作者:Robert A. T. Káldy - 一个简单、功能齐全的类,提供外观漂亮的分割器。与 MFC 的分割器不同,我发现它非常易于使用和扩展以满足我的需求。参见 https://codeproject.org.cn/KB/splitter/kaldysimplesplitter.aspx。
Dialog Resize 类,作者:Herbert Menke - CResizeCtrl 是一个简单易用但非常有效的类,它允许在对话框调整大小时自动移动/调整控件。这被用于 HexEdit 中的所有可调整大小的对话框,例如最近文件对话框、书签对话框等。参见 https://codeproject.org.cn/KB/dialog/resizectrl.aspx。
Big Integer 类,作者:Cap'n Code - 为了能够显示 C# Decimal 值(请参见属性对话框的 Real Values 页面),我需要能够处理 96 位整数。Microsoft 编译器仅支持高达 64 位的整数,但我在这里 CodeProject 上找到了这个类。尽管作者对其使用有一些说明,但在广泛测试后我无法挑出它的毛病。参见 CppIntegerClass.aspx。
Transparent Static Controls,作者:Ali Rafiee - 一个 MFC 类,提供“透明”静态控件。它用于 HexEdit 的“关于”框。参见 https://codeproject.org.cn/KB/static/TransparentStaticCtrl.aspx。
CSplashWnd,作者:P. J. Naughter - 用于 HexEdit 的启动画面。(找不到页面,但我确信它来自 CodeProject。)
MD5 算法,作者:Ron Rivest - 该算法是一种加密校验和(有时也称为单向哈希函数或消息摘要)。它生成一个 128 位值,通常用于检查通过不安全链接传输的文件的真实性,以检测篡改。MD5 命令已添加到 HexEdit 3.2 中,因为通常会为通过 Internet 下载的文件提供 MD5 值。
WIX Installer Toolkit,作者:Rob Mensching 等人 - 一个免费的基于 MSI 的安装程序,可以生成足够好的安装程序并且非常灵活。但是,除非您非常熟悉 Windows Installer 的工作方式,否则它有点难以理解和使用。参见 http://wix.sourceforge.net/。
Subversion source control,作者:Jim Blandy 等人 - 不是源代码的一部分,但对于开发至关重要,SVN(sub-version)提供了一个出色的免费版本控制系统。我使用过许多版本控制系统,这是迄今为止最好的。参见 http://subversion.tigris.org/。
TortoiseSVN SVN 客户端 - Stefan Küng 等人 - TSVN(TortoiseSVN)提供了一个非常好的 SVN 接口,集成了 Windows Explorer。(SVN 本身只提供命令行工具。)过去,版本控制对我来说很麻烦,但 TSVN 实际上让它变得令人愉快。参见 https://tortoisesvn.cn/。
一些代码 - 使用 CMemDC 进行双缓冲
编辑要求我在文章中包含一些示例代码。HexEdit 中有很多有趣的代码片段,但我实在无法决定现在要解释什么,所以我只选择了最后一次修改的内容。这是为了使用 MFC 中那个鲜为人知的 `CMemDC` 类来改进俯视视图中的“行进蚂蚁”显示而进行的一些代码更改。
如果您不知道“行进蚂蚁”和俯视视图是什么,我将快速解释一下。俯视视图是文件的替代视图,其中每个字节显示为一个像素,其颜色由当前颜色方案决定。作为文件的高级概述,它非常有用。
俯视视图也有助于了解文件中的不同内容(例如搜索匹配项、书签、选区等)在哪里。这可以显示在俯视视图的左边框内以及视图中的“行进蚂蚁”。行进蚂蚁就像缓慢移动的蚂蚁踪迹。这使得它们更容易看到,因为人眼非常擅长检测运动。
行进蚂蚁(在 HexEdit 3.5 中)的问题是它们只有一像素宽,并且在俯视视图中放大时不如它们本来应该那么明显。放大时将蚂蚁画得更宽很容易,但这会导致闪烁,当蚂蚁较细时并不明显。这就引出了双缓冲。
闪烁是“双缓冲”被发明的经典例子。这是因为背景(俯视位图)在绘制新蚂蚁(稍微偏移)之前被绘制在旧蚂蚁的顶部。双缓冲用于动画,方法是在显示每个新图像之前将其绘制在屏幕外缓冲区中。这样,绘制过程的伪影对用户来说是不可见的。
使用 `CMemDC` 类将代码转换为使用双缓冲很容易。首先,这是旧代码(在 AerialView.cpp 中)的样子。
BOOL CAerialView::OnEraseBkgnd(CDC* pDC)
{
// Work out dimensions of window client area
...
// Get background color and create new brush
...
// Draw background of borders using device context (pDC)
...
return TRUE;
}
void CAerialView::OnDraw(CDC* pDC)
{
// Work out colors (selection, bookmarks, etc)
...
// If not printing and not finished aerial view bitmap draw progress indicator
...
// Draw margin indicators in left border using pDC
...
draw_bitmap(pDC); // draw the actual aerial view pixels
// Draw marching ants on top of the bitmap using pDC
...
}
如果您不知道 Windows 如何处理窗口绘图,我应该解释一下,它通过 WM_ERASEBKGND 和 WM_PAINT 两个阶段处理,这大致对应于上面 MFC CView 方法 OnEraseBkgnd 和 OnDraw。拥有独立的擦除和绘制阶段是有益的(例如,通过使用 noErase 标志进行绘制来避免闪烁),但由于我们使用双缓冲,因此不再需要独立的擦除阶段——我们只需在绘制开始时擦除。
我过去使用 MFC 附带的非常有用的 Keith Rule 的 CMemDC 类在 MFC 代码中添加了双缓冲(参见 https://codeproject.org.cn/KB/GDI/flickerfree.aspx)。使用它很简单,只需创建一个 CMemDC 实例(它会创建屏幕外缓冲区),然后绘制到它的设备上下文而不是视图的设备上下文。当 CMemDC 实例被销毁时(在 OnDraw 结束时),它会自动将屏幕外缓冲区 BLT 到显示屏。
但是,当我尝试编译 CMemDC 代码时,遇到了名称冲突。看来 MFC 在某个阶段自己添加了一个 CMemDC 类。所以,我改用了 MFC 的 CMemDC 类。幸运的是,它的工作方式与 Keith Rule 的 CMemDC 完全相同(可能不是巧合)。
所需的唯一代码更改是:
- 将所有 OnEraseBkgnd 代码移到 OnDraw 的开头。
- 在 OnDraw 的开头创建一个 CMemDC 实例(bufDC)。
- 将 pDC 的使用更改为 bufDC.GetDC()。
BOOL CAerialView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CAerialView::OnDraw(CDC* pDC)
{
CMemDC bufDC(*pDC, this);
// Work out dimensions of window client area
...
// Get background color and create new brush
...
// Draw background using buffered device context (bufDC.GetDC())
...
// Work out colors (selection, bookmarks, etc)
...
// If aerial view bitmap is still being generated then draw progress indicator
...
// Draw indicators (selection, bookmarks, etc) in left border using bufDC.GetDC()
...
draw_bitmap(&(bufDC.GetDC()));
// Draw marching ants on top of the bitmap using bufDC.GetDC()
...
// bufDC destructor gets called here (end of scope) which renders the buffered
// bitmap onto the display (pDC)
}
我如何提供帮助?
错误
我不认为 HexEdit 中有很多错误,尽管有一些设计缺陷。如果您发现错误,请在 HexEdit Bugs 论坛 中报告。更好的是,如果您能追踪到原因并发送修复。
增强功能
如果您愿意提交代码更改,我非常乐意将增强功能合并到 HexEdit 中。在开始之前,您最好先与我联系,以避免重复劳动。
模板
一些 HexEdit 用户提交了模板,这些模板包含在发行版中。
如果您有特定文件格式的模板的想法,请与我们联系。如果您在创建或调试模板时遇到任何问题,请给我发电子邮件,我非常乐意提供帮助。
结论
HexEdit 4.0 比早期版本有了几处改进。主要变化是迁移到新的 MFC 并使用可对接窗口和其他新的 GUI 功能。但最受欢迎的功能仍然是模板系统。
如果别无他法,您可能仅出于查看或编辑二进制数据的目的而发现 HexEdit 有用。您可能会使用部分代码,或者发现如何使用新 MFC 的功能。如果您真的有兴趣,可以对其进行修改并添加您所需的功能。
历史
2011 年 1 月 首次发布文章,以配合 HexEdit 4.0 beta 版的发布。
2012 年 7 月 HexEdit 4.0 正式发布的小更新。 创建了三个单独的下载:二进制文件、项目和附加构建文件。 与上一个 beat 版本相比,代码有许多小的 bug 修复和一些改进。 还为 VS2012 提供了项目文件。