java 十六进制转图片_从零开始写文本编辑器(九):十六进制查看模式

4c949e048e6581d08f56ae4bf681000d.png

前言

计算机科学中有二进制/八进制/十六进制,以及我们最熟悉的十进制,但十六进制是文本编辑器必须要支持的格式,因为在数据层调试时,要看到数据乱码或不可见字符的数字编码是什么,十六进制比二进制/八进制更容易阅读和存储(排版)。

字符char转十六进制的核心逻辑有两处:

  1. 一个ASCII字符是8位,转为十六进制要组装高4位与低4位,需要用到移位运算符>>4
  2. 输出时要考虑到排版本的美观性,所以要将不可见字符和非ASCII字符显示为'.'号。

在编码前先调研参考EditPlus等编辑是如何显示的。

6a0a41a2cf54d2b651ecab14d488bc14.png

图中的细节点很多,我首要关心的是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为工具栏按钮

4b0d26209786b9cd80326267fd2078d1.png
  • 为了快速切换,我维护两套JTextPane/JList/ListCellRenderer/ListModel,并用枚举来记录当前的显示模式
private 

dbb654f3de5d42bfa1055ccf4df66bd4.png

6dfa28d1dcab344e0892939e148f51aa.png

图中可以看到,在类/实例的命名上,我采用先大后小的写法,这样eclipse的代码补全更方法触发,也利于联想记忆。

与文本编辑的行号一样,十六进行的行号也是用JList来显示的,逻辑与行号基本相同。

il0vec:从零开始写文本编辑器(四):行号​zhuanlan.zhihu.com
7ec05e3e54dc95e73d837eb7dafb4bb3.png

不同的是显示的标签文本内容,用到字符串格式化,这是每个程序员入门的printf方法,只是java里我常用String.format()

public 

%08x表示宽8的十六进制,高位补零。

十六进制是为了查看字节数据的,所以禁用了文本编辑功能

textPaneOfHexView

为了让十六进制字节排版对齐,使用了等宽字体'consolas',选它是因为eclipse也默认用它。

textPaneOfHexView

还有一些没完成的小需求。比如:选中字节联动选中字符,反之同理。这类小需求跟鼠标/代码着色有关,就不在本篇细谈了,只是一个线性方程的逻辑。

最后效果如下

df31ff2e82f5c8b8ff9f1c77226e21f7.png

2e5efec4fa6816af7aa9b91dcbebf4c1.png

软件

  • Eclipse
  • EditPlus

参考

  • csdn论坛搜索关于“十进制转换为二进制高位补零”的文章

以上~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值