imhex 加入 Big5 编码显示

我在解析红楼梦 2001 资源的时候遇到了一个挺新鲜编辑器,觉得可以分享一下, 目前满符合我的要求,不过先说一下,可能没那么好用

由来

熟悉我的朋友知道,我之前常用的 16 进制编辑器(后面我会称之为 hex 编辑器,比较简单)是 VSCode 的扩展, 为什么又开始折腾这个,是因为我在用 ollydbg 调试繁中程序时,注意到这样一个情况:

这两段文字其实是从文件中加载出来的,但是 VSCode 的 hex 编辑器就没有这么贴心的功能, 于是我开始重新寻找新的编辑器。

于是我又在各种 10 大 Hex 编辑器榜单中摸爬滚打,最终选择了两款:

wxMEdit

wxMEdit 看上去很朴素,但是也基本满足我的要求。

ImHex

显然 ImHex 的 UI 要更舒服一些,但是 ImHex 的问题也不少,比如, 默认安装是不带其他 encoding 的,只能看 ascii,不过 ImHex 提供了不少其他功能, 可以让我少开几个应用,让我觉得,可能折腾一下是值得的,

步骤

这个问题分为两个部分,首先是如何让 ImHex 在 ASCII 右侧显示一个新的 encoding。 为此,官方有一个 content store(Extras → Content Store),提供了一些 encoding:

按道理,直接安装就好,不过我没看到 Big5 编码,这个就比较头痛了,别急, 还有更头痛的,把这些编码全安装完,我也没看到哪里多出了增加显示编码的地方。

后来发现,是 File 下的 Import:

后面会提示我们选择一个文件:

选了文件就可以显示编码结果了,那么我们下一步就是如何把这个文件生出来。

制作一个 big5.tbl

我们看一下其他编码的文件,大概就可以猜出来,这个文件要怎么写:

所以其实就是 [hex 编码]=[unicode 字符]这个格式。根据维基百科

大五碼是雙位元組字符集,以十六進制表示,使用雙八碼儲存方法,以兩字節安放一字。第一字節稱為「高位字節」,第二字節稱為「低位字節」。

「高位字節」使用了0x81至0xFE,「低位字節」使用了0x40至0x7E,及0xA1至0xFE。

所以这个文件我们完全可以自己生出来:

let mut content = vec![];
for i in 0u16..=0xffff {
    let b = i.to_be_bytes();
    if b[0] < 0x81 || b[0] > 0xfe {
        continue;
    }
    if b[1] < 0x40 || (b[1] > 0x7e && b[1] < 0xa1) || b[1] > 0xfe {
        continue;
    }
    let prefix = format!("{:04X}=", i).as_bytes().to_vec();
    content.extend(prefix);
    content.extend_from_slice(&b);
    content.push(b'\n');
}
std::fs::write("big5.tbl", content).unwrap();

注意这个文件目前的文字编码格式还是 big5,需要转换一下,我们在 VSCode 中打开文件, Ctrl-Shift-P 执行「Change File Encoding」

然后选择「Reopen with Encoding」

接着找到 Big5 的编码就可以了

接下来文件中可能还是会有「?」显示的字符,这些字符可能是 Big5 的自定义字符, 也可能是未使用的字符,也可能是无法对应到 utf8 的字符,这些字符对我们基本意义就不大了, 直接删去就好。整理完成后,Ctrl-Shift-P 执行「Change File Encoding」然后选择「Save with Encoding」, 再找到 utf8,就可以把文件保存为 utf8 格式。

接下来我们就可以在 ImHex 的「Custom Encoding File」那边通过「Browse」选择我们生成的 big5.tbl 来查看了, 更简单一点,我们可以把文件放在 [ImHex 安装目录]/encodings 目录下, 这样就可以像上图一样直接在列表中选到了。最终会是这个样子:

如果文件比较大,移动到指定位置时,encoding 的结果会出不来,需要手动翻页下去, 还挺无语的,比较快速的折衷办法是把想显示的部分在新的 view 中打开:

这样编码结果就很快出来了:

总结

看到这里的读者有一个奖励,如果觉得写程序输出一个编码文件比较麻烦, 我这里有一份现成的:点击这里

通过上面的说明,我想各位读者对 ImHex 有一种半成品的感觉,是的,我也是这样想, 作为一个比较新的 hex 编辑器,ImHex 有很多地方需要改进,但是为什么我选择了这么一个半成品, 其实是因为 ImHex 的其他附加价值,这个我们回头结合用例一起看好了,如果你已经有了顺手的工具且满足需求, 我是觉得没必要切换到 ImHex。如果你在用 ImHex 且同时需要查看数据文件中的编码, 那么希望这篇可以帮到你。ImHex 确实是一个漂亮且优先考虑了反向工程的 hex 编辑器, 不过距离成熟还有很长的一段路要走。