知识大全 用Java制作十六进制编辑器

Posted 字符

篇首语:富贵必从勤苦得,男儿须读五车书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java制作十六进制编辑器相关的知识,希望对你有一定的参考价值。

用Java制作十六进制编辑器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  本人在用Java编制一个网络应用测试工具的时候 迫切希望能以十六进制方式显示和编辑socket上传输的数据 于是自己动手写了一个编辑器类 实现基本的十六进制编辑功能 效果如图一 图二所示 可以看到 编   辑器可以支持常规方式和十六进制两种方式对数据进行编辑   分析 对于同一段数据值 用两种方式来显示和编辑 则用MVC(模型-视图-控制器)模式来作为主结构是再合适不过的了 模型的作用是保存真实的数据值 同时提供若干提取和修改数据的方法 视图是数据在用户界面上的表示 控制器定义用户界面对用户输入的响应方式 即把用户的键盘动作和鼠标动作解释成模型中的数据操作方法 出于简化的考虑 本例中把视图和控制器合并到了一起   模型的设计 编辑器必须能处理任意字节块 所以考虑模型内用字节数组来存储数据 要提供在指定偏移处增加 修改和删除字节块的操作 当模型内的数据被改变时要及时通知视图来刷新用户界面或其它感兴趣的对象       图一     图二    视图和控制器的设计     对于常规编辑的视图 只需把模型中的字节数组转化成String 使用一个文本区域组件JTextArea来显示即可 JTextArea本身也是一个遵循MVC模式的Swing组件 它的控制器即可被用来作为我们自己的控制器 监听它的文本增加 修改和删除事件 从而控制我们自己的数据模型     对于 进制编辑的视图 同样可以用JTextArea来显示 只是在显示之前 要对模型中的数据进行若干加工 如每行显示 个字节 每行都要加表示偏移量的头 行尾要加这一行数据的字符串表示形式 它的控制器则不能简单的利用JTextArea的控制器了 为了保证显示格式不被打乱 需要监视它的所有光标移动事件 键盘击键事件等 同时 为了保持与UltraEdit的十六进制编辑器的功能一致性 对它的数据的增加 删除功能提供两个按钮 询问用户操作的字节数 如果增加n个字节 则在输入光标处插入n个十六进制值为 的字符(字符空格)   十六进制编辑器的主要结构请参见下图 由于篇幅关系 图中只列出了十六进制编辑部分 常规编辑部分请读者自行设计     图三    下面分别就几个主要的方法的功能和主要流程加以说明     HexPane displayValue方法 它主要完成数据的显示工作     public void diplayValue()     canvas setText( );      byte[] data = model getData();    int dataLen = data length;      // 把字节数组按每 个字节为一块进行分块     int lines = dataLen / + ;    int tails = dataLen % ;    int offset = ;    for(int i = ; i < lines; i ++)     // 在canvas的新行上加上行标,如“000020:”,表示这是第3行;    canvas.append(lineHead(i));    canvas.append(" ");    // 把数据块的字节值用Integer.toHexString()转化成长度为48的字符串,数据块不足16个字节的,在字符串后用空格补足;把字符串加入canvas的当前行;    for(offset = 0; offset < 16; offset ++)     canvas.append((i < lines - 1 || offset < tails) ? byteHex(data[i * 16 + offset]) : " ");    canvas.append(" ");        canvas.append("| ");      // 把数据块构造成字符串,添在canvas的行尾;    canvas.append(bytesToStr(data, i * 16, (i == lines - 1) ? tails : 16));    if(i < lines - 1) ta.append("\\n");    ;      这里的bytesToStr方法有两点特别需要注意的地方,一是不可见字符,如果不屏蔽这些字符,则我们的编辑器的显示格式会被搞得乱七八糟,一般可以把ASCII值0到0x1F和0x7F的33个字符全部替换成0x2E,即字符小数点。WINgWit.二是中文字符,因为每个中文字符是2个字节,如果数据块的起始字节一个中文字符的一半(可以用ASCII值大于0x7F来判断)的时候,将会显示一串乱字符,处理方法是不显示该字节。  为叙述方便,我们把canvas中显示每一行的行标的区域称为标号区,它宽度固定为8个字符(6个字符显示标号,一个冒号和一个空格);把canvas中显示十六进制数据的区域称为数据区,宽度固定为48个字符(每字节用十六进制显示为2字符宽,两两之间有一个空格,则总宽为16×3);把canvas中每行以字符串形式显示数据的区域称为字串值区,宽度不定(最短为8个字符――全中文状态,最长为16个字符――全英文状态)。    我们的canvas是一个Swing的文本组件,我们不但用它显示数据,还显示标号和字串值,而只有数据才是允许被编辑的,所以我们给canvas增加了CaretListener和KeyListener,当输入光标落在不允许编辑的区域时,我们要把光标自动移到最近的允许编辑的地方去。    public void caretUpdate(CaretEvent e) // 这个方法在输入光标移动时被触发    int pos = canvas.getCaretPosition(); // 输入光标相对canvas第0行第0个字符的偏移量    int line = 0;    int startPos = 0;    try     line = canvas.getLineOfOffset(pos); // 输入光标位于第几行    startPos = canvas.getLineStartOffset(line); // 当前行的第0个字符相对canvas第0行第0个字符的偏移量    catch(BadLocationException exception)     if(pos - startPos < 8) // 输入光标在标号区    canvas.setCaretPosition(startPos + 8); // 移动到数据区第0个字符    else if(pos - startPos > 54) // 输入光标在字串值区    canvas.setCaretPosition(startPos + 54); // 移动到数据区最后一个字节    else if((pos - startPos - 8) % 3 == 2) // 在数据区的间隙空格上    canvas.setCaretPosition(pos - 1); // 往前移一个字符          public void keyPressed(KeyEvent e) // 当键盘被按下时触发    int key = e.getKeyCode();    switch(key) // 如果是方向键则移动输入光标    case KeyEvent.VK_LEFT:    setCaretPrev();    break;    case KeyEvent.VK_RIGHT:    setCaretNext();    break;    case KeyEvent.VK_UP:    setCaretPrevLine();    break;    case KeyEvent.VK_DOWN:    setCaretNextLine();    break;    default:    return;          public void keyTyped(KeyEvent e) // 在键盘的可见字符被输入时触发    char ch = e.getKeyChar();    if((ch >= \'0\' && ch <= \'9\') || (ch >= \'a\' && ch <= \'f\')    || (ch >= \'A\' && ch <= \'F\'))     int pos = canvas.getCaretPosition(); // 先获取光标位置的信息    int line = 0, startPos = 0;    try     line = canvas.getLineOfOffset(pos);    startPos = canvas.getLineStartOffset(line);    catch(BadLocationException exception)     char c = (char)0;    if((pos - startPos - 8) % 3 == 0) // 一个字节值的前4位    c = canvas.getText(pos + 1, 1).charAt(0);    model.updateBytes(line * 16 + (pos - startPos - 8) / 3, Byte.parseByte("" + (char)((ch << 4) + c), 16));    else // 一个字节值的后4位    c = canvas.getText(pos - 1, 1).charAt(0);    model.updateBytes(line * 16 + (pos - startPos - 8) / 3, Byte.parseByte("" + (char)((c << 4) + ch), 16));    setCaretNext();                到这里为止,十六进制编辑的显示和输入控制已经基本完成了,下面开始解决数据Model的问题。Model是用来保存数据的,并且提供增加、修改和删除数据的方法,还要维护一个监听者组,在数据被改变时向监听者发出通知。这里提供一个简单的实现版本。  import javax.swing.event.EventListenerList;      public class DefaultBytesModel implements BytesModel    private EventListenerList listeners = new EventListenerList(); // 监听者组    private byte[] data = null;      public DefaultBytesModel (byte[] bytes)     data = new byte[bytes.length];          public void addModelListener(BytesModelListener listener)     listeners.add(BytesModelListener.class, listener);          public void removeModelListener(BytesModelListener listener)     listeners.remove(BytesModelListener.class, listener);          /**   cha138/Article/program/Java/Javascript/201311/25384

相关参考

知识大全 给大家推荐几个方便java编辑的软件

  建议java初学者一般不要用Jbuilder因为很多东西都需要熟悉的    但是很多的爱好者却很烦记事本的难看的编辑效果又烦每次编译和运行都要在MSDOS窗口输入烦人的命令这里推荐两个编辑软件可以

知识大全 用Java制作网络文件下载系统

用Java制作网络文件下载系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于Linux操作

知识大全 Java很神奇 用swing制作欢迎屏幕

Java很神奇用swing制作欢迎屏幕  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  几乎所有时

知识大全 FCKeditor编辑器在JAVA中的使用

FCKeditor编辑器在JAVA中的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  工作前

知识大全 FCKeditor编辑器在JAVA中的使用与配置

FCKeditor编辑器在JAVA中的使用与配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 用什么软件制作海报能打印出一米长,80厘米宽的

用什么软件制作海报能打印出一米长,80厘米宽的喷绘和写真喷绘店的设计师,大多是用AdobePhotoshop设计大幅海报,也有用图形编辑软件的,比如CorelDRAWX5这类软件。用什么软件制作海报简

知识大全 用wps制作ppt添加文字时为什么不是顶格

用wps制作ppt添加文字时为什么不是顶格数字默认的对齐方式是右对齐,在顶格写的话手动设置成左对齐就可以了。制作ppt怎么添加文字打开幻灯片,在普通视图中选中你要编辑的幻灯片,然后在工具栏里选“插入”

知识大全 如何在myEclipse中执行已编辑好的JAVA程式

如何在myEclipse中执行已编辑好的JAVA程式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 请教高人,如何在电脑上制作帐目表格?

请教高人,如何在电脑上制作帐目表格?步骤:1、打开Excel表格编辑器。2、做出基本框架,选中表格全部。3、右击鼠标,会出现一个表,点击“设置单元格”。4、第四步会出现一个对话框,点击“对齐”选中水平

知识大全 怎么样才能在百度百科里制作百科名片

怎么样才能在百度百科里制作百科名片?你好,有三种方法。一,兑换百科名片编辑令,商城里面有,需要财富值。二、需求大神的帮助,帮你编辑。三,努力编辑词条,达到要求成为核心用户就可以啦。复杂50,通过率85