Skip to content

毛俊的博客

服务端linux下用十六进制查看class字节码

linux1 min read

一般都是将java代码编译成字节码class文件打包成war或者jar部署到服务端,如果使用Tocmat部署War包,Tomcat部署后会自动解压一个以War包名的文件夹,里面包含了javaclass`文件以及静态资源和配置文件。

linux下查看十六进制

在服务端下查看class文件,如果直接用Vim等编辑器打开默认显示的是二进制乱码。如果要以十六进制查看class文件则需要使用对应的工具,GNU/Linux下可以使用xxd命令,将二进制信息转换为十六进制数据:

1$ xxd foo.class bar.txt

生成的bar.txt里面保存了class文件的十六进制,就可以通过编辑器直接打开查看。

但是这样会显得比较麻烦,如果能直接用编辑器打开查看就方便多了。

vim查看十六进制

vim除了查看文件外,还可以在vim编辑器内调用外部命令:

首先用vim直接打开class文件,结果是二进制乱码。接着使用Vim调用外部的xdd命令:

切换到命令模式,即按Esc键,输入:%!xxd,即可以查看十六进制的class的字节码。

如果需要还原为二进制内容则输入:%!xxd -r,即可以退出十六进制查看的方式。

其他Vim命令:

1:%!xxd :%!od 将当前文本转化为16进制格式
2:%!xxd -c 12 每行显示12个字节

vim下文件头乱码

但是使用%!xxd进行十六进制显示时,文件头显示为3f3f 3f3f,3f的ascii码是?,这可以和Vim解析时乱码有关系。因为上面通过xxd foo.class bar.txt查看文件是正常显示java的标识cafe babe的。由于我配置了Vim的自定义配置文件.vimrc,其中包含set fileencodings=utf-8,gb2312,gbk,gb18030,ucs-bom,所以class的文件头cafe babe不是任何一个中文的编码,vim找不到对应的中文字,就显示为??`,即:3f3f。

解决办法

直接使用vim -u NONE -N class名称,然后再配合:%!xxd命令就可以正常显示十六进制的文件头cafe babe了。

vim -u NONE -NVim启动不加载vimr配置并且禁用vi兼容模式。

© 2020 by 毛俊的博客. All rights reserved.
Theme by LekoArts