仿Hex-Editor,实现简单地二进制文件查看器JHexer
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相关推荐
- 改cpp[1] Vscode Hex Editor,在vscode中查看内存
#c 引入 我们在开发C++时,常常需要与内存打交道.调试时,查看内存的变量就成了一个很重要的需求.在vs中查看非常方便,但在vscode中并不能直接查看.虽然vscode可以监听到变量,但看不到内存 ...
- JavaSwing图片绘制,实现简单的图片查看器
刚学到JavaSwing图片绘制,于是自己做了个简易的图片查看器小程序,在这里分享给大家,请多多指教. 话不多说先上部分图: 绘制图片需要自定义一个控件,我们这里写一个继承自JPanel的类,重写pa ...
- 制作一个简单的照片查看器(支持缩放手势)
本文主要实现的功能是制作一个照片查看器,点击照片能进入大图模式,支持左右滑动,支持手势缩放, 本文只演示1张图和3张图的效果,其他的效果分为为: 2张图的时候按照1行2列展示, 3张图的时候按照1行3 ...
- iOS开发-简单的图片查看器
现在你只要拿着手机,不管你Android还是iOS,新闻类的App不可避免都有一个功能就是图片查看,做个专题,查看一下内容,App Store中也有专门针对图片浏览的App,鉴于目前所知有限,无法做到 ...
- android 图片查看源码,Android 简单的图片查看器源码
public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...
- 【QT学习】制作一个简单的图片查看器(完整源码)
- 【J2SE】java实现简单照片查看器
程序执行结果: project结构图: 程序代码: import java.awt.BorderLayout; import java.awt.FileDialog; import java.awt. ...
- windows照片查看器无法显示此图片_Real3d PhotoViewer下载-照片查看器 v1.2.2 官方版...
Real3d Photo Viewer是一款简单易用的照片查看器,旨在帮助您打开与查看jpg.jpeg.jpe.bmp.tif.tiff.pgm.pbm.ppm.ras.sr等多种照片文件,而且提供了 ...
- IFC模型文件查看器(基于IFC++开源库实现)
关于IFC IFC是由buildingSMART以工业的产品资料交换标准STEP编号ISO-10303-11的产品模型信息描述用EXPERSS语言为基础,基于BIM中AEC/FM相关领域信息交流所指定 ...
- Qt项目实战2:图片查看器QImageViewer
在博文Qt学习笔记2:QMainWindow和QWidget的区别中介绍了使用空的Qt项目创建带有菜单栏.工具栏的界面. 这里,使用一个简单的图片查看器项目,来熟悉一下Qt的图片显示和基本操作. 该项 ...
最新文章
- 为什么DOM操作很慢
- Flat - Music scores and guitar tabs editor(乐谱编辑器)
- w3cschool的jQuery Mobile教程总结
- 查询已安装rpm包信息
- java中序列化怎么创建_【java】面试官问我,如何实现一个自定义序列化
- php自动加载 依赖,php自动加载
- 获取所有股票历史数据存到Excel
- caxa线切割怎样画链轮_在CAXA中怎么画链轮啊?
- 为什么要进行网站重构呢?
- 一个使用kindle近3年的菜鸟的几点建议
- Matlab科研绘图颜色补充(特别篇)—51种中国传统颜色
- 如何做好网站的安全性测试
- php faker,laravel使用Faker数据填充的实现方法
- opencv+directshow采集视频图像
- springboot启动 lombok 找不到符号
- 网页上显示天气预报信息的代码(将代码拷贝到你的网页上即可,当然,天气预报只能在联网的情况下才能使用)
- 基于外卖平台POI的城市餐饮业空间热点分析系统
- 电脑监控是真的吗?4个实验一探究竟
- 搬砖:void (*signal(int sinno,void(*func)(int)))(int) 函数指针
- BTC系列 - UTXO事务模型