我想了解诸如 winHex 之类的实用程序,它们是磁盘编辑器。他们访问硬盘并以大约 2TB 整个硬盘的十六进制表示数据。他们如何在单个滚动区域中实现这一点并在其中提供撤消功能....应该使用哪个小部件来显示如此大量的数据.???? 我想在 QT 中制作这个应用程序。
1 回答
他们如何在单个滚动区域中实现这一点
它不是包含整个磁盘的“单个滚动区域”。它是一个滚动条,可以为您当时显示的任何磁盘内容动态生成内容。
只需根据滚动位置计算位置(除非您的屏幕有 10000 像素高,但是,您将无法将光标准确地放置在您想要的磁盘扇区上)。
还提供了撤消功能......
撤消功能,我希望(我没有看过代码)是通过在某种容器中保存“地址已更改,旧值”来完成的。几乎与您对任何其他大型数据集执行撤消信息的方式相同。
应该使用哪个小部件来显示如此大量的数据.????
一种显示文本并允许您拦截重绘并在每次重绘操作时提供您自己的数据。恐怕我对QT不是很了解,所以不能就细节提出建议。
显然,您没有涵盖的一个因素是“如何在已安装的情况下以读写模式打开/安装整个磁盘” - 我不确定它是否允许这样做,但如果允许,我希望有是一个涉及的磁盘过滤器驱动程序,它具有“侧面”接口以允许在文件系统的幕后进行更新。
编辑:回答评论中的问题:
有两个选项,要么在数据更改时写入磁盘。在这种情况下,代码需要记住所有原始值,并在用户执行undo
操作时恢复它们。另一种方法大致相同,即存储所有编辑(“将 1000 处的值更改为 05”),然后当要求显示某些内容时,在实际显示操作之前处理显示范围内的任何编辑。
显然,如果有人决定玩“键盘上的猴子”数小时(数周,数月)以用相当随机的内容填充整个磁盘,那么在内存不足的情况下“记住”所有内容将是一个问题,所以你可能需要一个“我已经用完内存来存储撤消信息,你想保存你到目前为止所做的事情吗?” 类型选项。
还可以考虑“存储在大部分中的相同值”类型压缩(例如,如果您有“从 A 到 B 的值 X 填充”,您只需存储“从 A 到 B 我们已经用 X 填充”,而不是比存储可能有许多兆字节的“A = X,A+1 = X,A+2 = X ... B-1=X,B=X”)。