前言
计算机科学中有二进制/八进制/十六进制,以及我们最熟悉的十进制,但十六进制是文本编辑器必须要支持的格式,因为在数据层调试时,要看到数据乱码或不可见字符的数字编码是什么,十六进制比二进制/八进制更容易阅读和存储(排版)。
字符char转十六进制的核心逻辑有两处:
- 一个ASCII字符是8位,转为十六进制要组装高4位与低4位,需要用到移位运算符>>4
- 输出时要考虑到排版本的美观性,所以要将不可见字符和非ASCII字符显示为'.'号。
在编码前先调研参考EditPlus等编辑是如何显示的。
图中的细节点很多,我首要关心的是1)一行的排版对齐 2)尾部不足一行的边界逻辑
- 用注释列出一行的字符示例。
数字标记了一个字节组跨度的长度,eclipse的自动格式化会将注释里的多个空格减少为1个,所以我改用下划线'_'表示连续多个空格。
// 00 11 22 33 44 55 66 77__88 99 AA BB CC DD EE FF__012345679ABCDEF
- 由于行字符数量是固定的67,所以用一个缓冲字符数组来重复记录。
private
使用三元条件运算符判定字符是否可见或为ascii字符
char
这个是为了不显示乱码(多字节编码会显示乱码)和非ACII字符(防止打乱字符串排版),统一显示为'.'号。
其它的代码都是在写GUI的胶水,简述如下:
- 为了简便,目前直接在菜单项:查看->16进制切换文本与16进制模式,后续会改进UI为工具栏按钮
- 为了快速切换,我维护两套JTextPane/JList/ListCellRenderer/ListModel,并用枚举来记录当前的显示模式
private
图中可以看到,在类/实例的命名上,我采用先大后小的写法,这样eclipse的代码补全更方法触发,也利于联想记忆。
与文本编辑的行号一样,十六进行的行号也是用JList来显示的,逻辑与行号基本相同。
il0vec:从零开始写文本编辑器(四):行号zhuanlan.zhihu.com不同的是显示的标签文本内容,用到字符串格式化,这是每个程序员入门的printf方法,只是java里我常用String.format()
public
%08x表示宽8的十六进制,高位补零。
十六进制是为了查看字节数据的,所以禁用了文本编辑功能
textPaneOfHexView
为了让十六进制字节排版对齐,使用了等宽字体'consolas',选它是因为eclipse也默认用它。
textPaneOfHexView
还有一些没完成的小需求。比如:选中字节联动选中字符,反之同理。这类小需求跟鼠标/代码着色有关,就不在本篇细谈了,只是一个线性方程的逻辑。
最后效果如下
软件
- Eclipse
- EditPlus
参考
- csdn论坛搜索关于“十进制转换为二进制高位补零”的文章
以上~