HexIt是一款专业的十六进制编辑器。编程人员都在使用的十六进制编辑器HexIt。它允许用户以非常低的级别编辑文件,以便他们可以查看文件的完整而准确的二进制内容。这对于修改二进制文件(例如可执行文件),编辑磁盘或CD映像以及调试错误生成二进制文件格式的程序很有用。还有许多其他功能非常有用;从最基本的角度来看,十六进制编辑器已经存在很长时间了,它们的编写非常简单,因为它们主要用于编辑文件,这些文件包含文件中的特定字节。位置,因此十六进制编辑器不需要使用插入模式。没有插入模式的十六进制编辑器易于实现。用户只需要为输入文件分配足够大的数组,然后它就可以用作数据结构。您真正需要有效执行的唯一操作是跳转到特定的字节位置。这是使数组容易的地方。需要它的用户可以下载体验。
使用说明:
简单的选择
编辑器中用于支持插入模式的一种技术是使用比文件大的数组,其中带有空格。直到当前光标位置的文件内容都存储在数组的开头。从当前光标位置到末尾的文件内容存储在数组的末尾。中间的间隙随光标移动。
这使其易于插入。当用户插入一个额外的字符时,只需将其添加到空格的一端或另一端即可。另一方面,现在移入文件非常慢。一次移动一个字节,一行甚至一个屏幕时,这种情况并不明显,但是当您尝试跳至文件的开头或结尾或特定的指定文件偏移时,突然,编辑器不得不转移一个大的字符。从间隙的一端到另一端的文件数据量。
另一个更好的选择是使用小型数组的链表,并让数组的大小在K到2K字节之间变化,以获得固定的最小块大小K。在中间插入单个字节不会花费太多一个街区有时,该块的大小会增加到2K以上,必须将其分为两个较小的块,但即使这样也不太慢。
但是,使用此结构仍然是O(N)操作。在实践中还算不错,因为链表的长度就是文件的大小,是最坏文件的1 / K倍。但是一旦文件变得很大,此方法就无法很好地扩展。
这两种方法的共同问题是,将插入操作设置为恒定时间操作后,搜索给定的字节位置将变为线性时间。当然,在原始数组格式中,搜索是恒定时间,但是插入变为线性时间。
使用平衡树
这是树木的来源。平衡树结构(AVL树,红黑树和B树)解决了列表排序问题。您可以在登录时将元素插入余额树,或者可以在登录时搜索特定元素。这听起来像是我们想要的一种折衷方案:如果使插入时间恒定的力趋于线性,反之亦然,则我们希望将两者都设置为对数时间。
但是,传统上使用平衡树来存储排序列表并不能立即为我们提供帮助。我们可以合理排序的唯一标准是文件中的字节位置。当我们将数据存储为一组(位置,数据)对时,我们将返回线性插入,因为我们必须更改
插入点之后的每个树元素。
我们如何用平衡的树木做些更好的工作?
树数
就在这儿。
假设您向平衡树的每个节点添加了一个附加字段。在此字段中,存储节点内或节点下的元素数量的计数。
现在,更改树(插入和删除)的操作必须确保这些计数保持准确。可以在不牺牲操作的日志时间特性的情况下完成此操作。例如,添加元素时,将增加包含该元素的节点的数量,然后将树备份到根,从而增加您传递的所有节点的数量。由于树的高度为O(log N),因此只需要O(log N)时间。
因此,我们可以将计数添加到树上并仍然有效地对其进行维护。伯爵买了什么?
一旦我们计算了一棵树,他们将引入一种搜索树的新方法。从根开始,我们可以通过检查count字段而不是像往常那样比较元素来搜索树。这样,我们可以在登录时间搜索中搜索树中的任何N个项目。例如,假设根树节点包含一个计数为54的孩子,然后是一个实际元素,然后是计数为73的孩子。然后:
如果您尝试到达的位置小于54,则您将直接下降到最左侧的孩子。
如果要精确定位位置54,请将元素移出根节点。
如果您尝试到达55或更高的位置,请下降到最右边的孩子,然后从所需位置减去55。 (如果您想要树的元素57,那么您知道树中右边子树的前面有55个元素,因此您知道想要右边子树的元素2。)
因此,现在我们有了一种在日志时间搜索中在树中找到第N个项目的方法。起初这似乎很有希望。
麻烦的是,我们仍然无法在树上设置某种排序顺序。现在我们需要处理它。
未分类的树木
排序问题的简单答案是完全消除树的排序!
常规的平衡树具有排序顺序,因为它用于查找树中的元素并知道在何处添加元素。但是我们不再需要排序顺序来查找事物,因为我们可以使用基于计数的搜索来跳到第N个位置。我们还可以在树加法操作期间使用数字,以便我们指定要添加新元素的位置吗?
我们可以。树添加算法通过搜索树以查找将在其中插入新元素的位置开始。如果使用计数以与上述完全相同的方式进行搜索,则可以在树中的任何位置添加所需的任何元素。当然,一旦完成,我们就必须完全放弃排序顺序,并且永远不要进行基于顺序的搜索或再次插入,因为它们将无法工作。但这并不重要,因为我们仍然不需要它们。
现在,我们拥有的正是我们最初追求的目标。我们有一个数据结构,用于存储无序的项目列表,以便我们可以在日志时间插入或删除项目,并在日志时间找到第N个元素。
分割并加入树木
现在我们可以开始变得更有野心了。我们尚未解决的一个问题是剪切和粘贴。
到目前为止,我已经讨论了树插入的假设,即一次只能在树中插入一个字符。实际上,十六进制编辑器需要剪切和粘贴到与普通文本编辑器相同的程度。因此,我们必须考虑如何立即插入或删除较大的数据块。
一个明显的方法是分别处理每个字节。十字节的剪切操作是十个单独的删除,十字节的粘贴是十个单独的插入。如果仅使用剪切和粘贴将大块数据中的微小数据块移动,那很好,但是如果您需要将文件的一半从一个位置移动到另一个位置,则事情变得更加有趣。
讨论的链表结构将对解决此问题有很大帮助。链接列表不仅使插入或删除项目变得容易:一旦找到列表的末端,它们同样也使取消巨大列表的链接同样容易,并且您也可以将块链接到其他位置。
事实证明,平衡的树可以完成相同的操作。此时,您开始使用哪种平衡树开始有所不同:AVL,红黑树和B树都支持这些操作,但是它们之间的精确方法不同。从现在开始,我将使用B树,因为该算法稍微简单一些。
我们需要的是两个基本操作。给定一个包含无序项目列表的无序B树,我们需要能够:
将树拆分为中间,并提供两个有效的B树作为输出。
取两个有效的B树并将其端对端连接以获得一个B树,其中包含来自树A的所有数据和来自树B的数据。
这将提供我们需要的所有操作。要从t的中间断开大部分
ree,我们将其分为两个位置,然后将两个外部部分重新连接在一起; 要将大部分链接到树的中间,我们在插入点将其拆分,将左半部分连接到插入部分的左侧,然后将右半部分连接到插入部分的右侧。
软件功能:
内置实时汇编器和反汇编器
记录和播放宏,普通文本查看器
比较两个文件dec / hex / bin / oct的计算器
查看/更改EXE标头
通过屏蔽某些字符来过滤文本
可配置的颜色,鼠标,按钮等
剪切,复制,粘贴剪贴板
搜索/替换,转到行/文件偏移
编辑,包括插入和删除字节,分屏
软件特色:
HexIt支持插入模式:如果您正在编辑可执行文件或文件系统映像
并不是特别有用,但在其他文件格式中可能会非常方便
剪切,复制和粘贴正在编辑的文件非常有效。
无论您要移动多少数据,即使它是CD映像的200Mb部分
HexIt始终可以立即高效地执行操作。
HexIt支持延迟加载输入文件:不会立即将所有内容立即吸入内存,
只需记住编辑缓冲区的哪些部分是输入文件的哪些部分的副本,
并在需要时引用磁盘上的文件。
仅当确实需要进行调整才能读取整个文件时,调整才会花费大量时间。
使用此属性的唯一两个操作是搜索文件的修改版本并将其保存到磁盘。
其他一切都是即时的。