0. 前言

当对Java语言的理解逐渐加深时,我们会有必要对.class文件有一定的了解,那么就少不了查看二进制文件。互联网上有很多的工具,能够帮助我们有效地查看,分析.class文件字节码。

那么我们何不自己写一个小工具来查看二进制文件呢?

当然,我们一般都是查看16进制的数据,所以这里尝试写一个最简单的二进制文件查看器,我们称之为JHexer

1. 设计模式

建造者(Builder)设计模式,它允许我们对对象进行链式操作,且直接使用,无需new等一系列初始化操作。

2. 代码实现

2.1 客户使用代码

public class HexDump {public final static String FILE_NAME = "./HexDump.class";public static void main(String... args) throws IOException {ByteCodes.readFrom(FILE_NAME, 32).show();}
}

ByteCodes即是我们的核心工具类。ByteCodes.readFrom(FILE_NAME, 32)返回一个ByteCodes对象,其中传参为文件名一行显示的字节数。然后调用ByteCodes对象的show方法,打印出二进制文件的信息。

所以,客户端就这么简单,非常易用。下面介绍核心类ByteCodes

2.2 ByteCodes核心类


public class ByteCodes {private final static int DEFAULT_ROW_SIZE = 16;private List<Byte> byteList = new ArrayList<>();private InputStream input;private int rowCount;private ByteCodes(){  }private ByteCodes(InputStream input) throws IOException {this(input, DEFAULT_ROW_SIZE);}private ByteCodes(InputStream input, int rowCount) throws IOException {this.rowCount = rowCount;this.input = input;read();}private void read() throws IOException {int b = -1;while ((b = input.read()) != -1) {byteList.add((byte)b);}}public static ByteCodes readFrom(String filename) throws IOException {return readFrom(filename, DEFAULT_ROW_SIZE);}public static ByteCodes readFrom(InputStream input) throws IOException {return new ByteCodes(input);}public static ByteCodes readFrom(String filename, int rowCount) throws IOException {InputStream input = new FileInputStream(filename);return new ByteCodes(input, rowCount);}public static ByteCodes readFrom(InputStream input, int rowCount) throws IOException {return new ByteCodes(input, rowCount);}public ByteCodes show() throws UnsupportedEncodingException {StringBuilder sb = new StringBuilder();sb.append("Address   ");for(int i = 0 ; i < rowCount ; i ++){sb.append(String.format("%02X ", i));}sb.append(String.format("  |   Dump   %n"));int b = -1, rowIndex = 0;byte[] rowBytes = new byte[rowCount];for(int i = 0 ; i < byteList.size() ; i++){if(i % rowCount == 0){sb.append( (i==0?"":"  |") + new String(rowBytes, 0, rowIndex) + (i==0?"":"|"));sb.append(String.format( (i==0?"":"%n") + "%08X: ", i));rowIndex = 0;}sb.append( String.format("%02X ", byteList.get(i)));byte curByte = byteList.get(i);if(curByte == '\n' || curByte == '\r' || curByte == '\t'){rowBytes[rowIndex++] = '.';} else {rowBytes[rowIndex++] = byteList.get(i);}}System.out.println(sb);return this;}}

DEFAULT_ROW_SIZE常数字段表示默认一行显示16个字节。重点关注show方法

3. 效果演示

下面是演示效果。

4. 更多

后续会更新对字节码的增删改查操作,使其更加完善

仿Hex-Editor,实现简单地二进制文件查看器JHexer相关推荐

  1. 改cpp[1] Vscode Hex Editor,在vscode中查看内存

    #c 引入 我们在开发C++时,常常需要与内存打交道.调试时,查看内存的变量就成了一个很重要的需求.在vs中查看非常方便,但在vscode中并不能直接查看.虽然vscode可以监听到变量,但看不到内存 ...

  2. JavaSwing图片绘制,实现简单的图片查看器

    刚学到JavaSwing图片绘制,于是自己做了个简易的图片查看器小程序,在这里分享给大家,请多多指教. 话不多说先上部分图: 绘制图片需要自定义一个控件,我们这里写一个继承自JPanel的类,重写pa ...

  3. 制作一个简单的照片查看器(支持缩放手势)

    本文主要实现的功能是制作一个照片查看器,点击照片能进入大图模式,支持左右滑动,支持手势缩放, 本文只演示1张图和3张图的效果,其他的效果分为为: 2张图的时候按照1行2列展示, 3张图的时候按照1行3 ...

  4. iOS开发-简单的图片查看器

    现在你只要拿着手机,不管你Android还是iOS,新闻类的App不可避免都有一个功能就是图片查看,做个专题,查看一下内容,App Store中也有专门针对图片浏览的App,鉴于目前所知有限,无法做到 ...

  5. android 图片查看源码,Android 简单的图片查看器源码

    public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...

  6. 【QT学习】制作一个简单的图片查看器(完整源码)

  7. 【J2SE】java实现简单照片查看器

    程序执行结果: project结构图: 程序代码: import java.awt.BorderLayout; import java.awt.FileDialog; import java.awt. ...

  8. windows照片查看器无法显示此图片_Real3d PhotoViewer下载-照片查看器 v1.2.2 官方版...

    Real3d Photo Viewer是一款简单易用的照片查看器,旨在帮助您打开与查看jpg.jpeg.jpe.bmp.tif.tiff.pgm.pbm.ppm.ras.sr等多种照片文件,而且提供了 ...

  9. IFC模型文件查看器(基于IFC++开源库实现)

    关于IFC IFC是由buildingSMART以工业的产品资料交换标准STEP编号ISO-10303-11的产品模型信息描述用EXPERSS语言为基础,基于BIM中AEC/FM相关领域信息交流所指定 ...

  10. Qt项目实战2:图片查看器QImageViewer

    在博文Qt学习笔记2:QMainWindow和QWidget的区别中介绍了使用空的Qt项目创建带有菜单栏.工具栏的界面. 这里,使用一个简单的图片查看器项目,来熟悉一下Qt的图片显示和基本操作. 该项 ...

最新文章

  1. 为什么DOM操作很慢
  2. Flat - Music scores and guitar tabs editor(乐谱编辑器)
  3. w3cschool的jQuery Mobile教程总结
  4. 查询已安装rpm包信息
  5. java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化
  6. php自动加载 依赖,php自动加载
  7. 获取所有股票历史数据存到Excel
  8. caxa线切割怎样画链轮_在CAXA中怎么画链轮啊?
  9. 为什么要进行网站重构呢?
  10. 一个使用kindle近3年的菜鸟的几点建议
  11. Matlab科研绘图颜色补充(特别篇)—51种中国传统颜色
  12. 如何做好网站的安全性测试
  13. php faker,laravel使用Faker数据填充的实现方法
  14. opencv+directshow采集视频图像
  15. springboot启动 lombok 找不到符号
  16. 网页上显示天气预报信息的代码(将代码拷贝到你的网页上即可,当然,天气预报只能在联网的情况下才能使用)
  17. 基于外卖平台POI的城市餐饮业空间热点分析系统
  18. 电脑监控是真的吗?4个实验一探究竟
  19. 搬砖:void (*signal(int sinno,void(*func)(int)))(int) 函数指针
  20. BTC系列 - UTXO事务模型

热门文章

  1. 将Python对象转换成字典
  2. 数据治理方案技术调研 Atlas VS Datahub VS Amundsen
  3. ExcelJS 将JSON数组转换成为Excel文件 / JSON转换成为XLSX / 网页导出Excel表格
  4. 软件评测师教程简介(第二篇-测试技术)
  5. Windows游戏编程 - 简单的弹球窗口
  6. 软考中级数据库系统工程师复习资料
  7. Android进阶之路 - 病毒检测工具
  8. 计算机键盘训练软件,键盘打字练习软件(TypingMaster)
  9. 统计自然语言处理——信息论基础
  10. 德尔福和Mobileye强强联手,将展示双方共同开发的CSLP系统