使用十六进制模式从二进制文件中间删除数据

Mcr*_*dle 13 emacs hex-editor

我有一个相当大的二进制文件(几十 MB),并且想在中间的某个地方删除几 KB,它夹在中间的数据不是开头也不是结尾。

理想情况下,我想使用 emacs,而 hexl-mode 似乎是一个可能的候选者。

是否可以从十六进制缓冲区中删除一行?Ctrl-k似乎没有完成这项工作。我很高兴查看代码,但无论出于何种原因寻找 hexl-mode.el 我发现的只是我的 Ubuntu 10.04 机器 Emacs 23.1 上已编译的 .elc 文件。

另外:偷偷摸摸地,我想添加另一个与标题中的问题没有直接关系的十六进制模式问题,但它是我面临的完整问题的一部分:如果我可以每行显示 X 个十六进制字符,其中 X 显然会随着我正在编辑的二进制文件的格式而改变,我找不到用十六进制模式来做到这一点的方法,我想我会在这里抛出这个问题。

小智 9

十六进制模式不允许您删除字符。堆栈溢出的这个答案提出了一个解决方法:用另一个字符(比如“X”)覆盖要删除的字符,切换出十六进制模式,找到这些字符并在那里删除它们。


Gil*_*il' 5

使用nhexl-mode(可以从 ELPA 作为包安装)。Nhexl-mode 是次要模式;文本在缓冲区已经处于的主要模式下保持可编辑状态。

默认情况下,nhexl-mode 激活覆盖模式,但您仍然可以删除。要插入文本,请使用 关闭覆盖模式M-x binary-overwrite-mode

您可以将以下代码片段放在 init 文件 ( ~/.emacs) 中,以将Insert密钥绑定到 nhexl 模式中的切换覆盖模式。

(unless (boundp 'nhexl-mode-map)
  (defvar nhexl-mode-map (make-sparse-keymap)
    "Keymap used when `nhexl-mode' is active."))
(define-key nhexl-mode-map [insert] 'binary-overwrite-mode)
Run Code Online (Sandbox Code Playgroud)

如果您使用 nhexl-mode,也可能很有趣。