一、魔数之定义

魔数这个词在不同领域代表不同的含义。在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数;二指程序代码中的魔数,也称魔法值。

  • 大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,怎么识别一个文件的类型呢?这就用到了我们提到的“魔数”。
  • 所谓魔数和魔字符串就是指在代码中出现但没有解释的数字常量或字符串,又称魔法值。如果在某个程序中你使用了魔数,那么在几个月或几年后你将很可能不知道它的含义是什么。

很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。常见文件的魔数如下:

  1. JPEG (jpg),文件头:FFD8FF
  2. PNG (png),文件头:89504E47
  3. GIF (gif),文件头:47494638
  4. TIFF (tif),文件头:49492A00
  5. Windows Bitmap (bmp),文件头:424D
  6. CAD (dwg),文件头:41433130
  7. Adobe Photoshop (psd),文件头:38425053
  8. Rich Text Format (rtf),文件头:7B5C727466
  9. XML (xml),文件头:3C3F786D6C
  10. HTML (html),文件头:68746D6C3E
  11. Email [thorough only] (eml),文件头:44656C69766572792D646174653A
  12. Outlook Express (dbx),文件头:CFAD12FEC5FD746F
  13. Outlook (pst),文件头:2142444E
  14. MS Word/Excel (xls.or.doc),文件头:D0CF11E0
  15. MS Access (mdb),文件头:5374616E64617264204A
  16. WordPerfect (wpd),文件头:FF575043
  17. Postscript (eps.or.ps),文件头:252150532D41646F6265
  18. Adobe Acrobat (pdf),文件头:255044462D312E
  19. Quicken (qdf),文件头:AC9EBD8F
  20. Windows Password (pwl),文件头:E3828596
  21. ZIP Archive (zip),文件头:504B0304
  22. RAR Archive (rar),文件头:52617221
  23. Wave (wav),文件头:57415645
  24. AVI (avi),文件头:41564920
  25. Real Audio (ram),文件头:2E7261FD
  26. Real Media (rm),文件头:2E524D46
  27. MPEG (mpg),文件头:000001BA
  28. MPEG (mpg),文件头:000001B3
  29. Quicktime (mov),文件头:6D6F6F76
  30. Windows Media (asf),文件头:3026B2758E66CF11
  31. MIDI (mid),文件头:4D546864

二、Class文件中的魔数

为了方便虚拟机识别一个文件是否是class类型的文件,SUN公司规定每个class文件都必须以一个word(四个字节)作为开始,这个数字就是魔数。魔数是由四个字节的无符号数组成的,Java的.class文件,开头的4个字节是0xCAFEBABE。 这个魔数值在Java还被称作“ Oak”语言的时候(大约是1991年前后)就已经确定下来了。它还有一段很有趣的历史,据Java开发小组最初的关键成员Patrick Naughton 所说:“我们一直在寻找一些好玩的、容易记忆的东西,选择0xCAFEBABE是因为它象征着著名咖啡品牌Peet's Coffee深受欢迎的Baristas咖啡。”下图就是一个编译后的class文件,可以看到文件开头就是cafebabe。

【注】在IDEA中添加HexView插件即可查看编译后的class文件。

三、魔数与Class文件的版本

紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。

Java的版本号是从45开始的,JDK 1.1之后 的每个JDK大版本发布主版本号向上加1(JDK 1.0~1.1使用了45.0~45.3的版本号),高版本的JDK能 向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,因为《Java虚拟机规范》在Class文 件校验部分明确要求了即使文件格式并未发生任何变化,虚拟机也必须拒绝执行超过其版本号的Class 文件。

例如,JDK1.1能支持版本号为45.0~45.65535的Class文件,无法执行版本号为46.0以上的Class文件,而JDK1.2则能支持45.0~46.65535的Class文件。目前最新的JDK版本为13,可生成的Class文件主版本号最大值为57.0。

上图中的版本号是34,对应的十进制为52,所以对应的JDK版本为1.8。

从JDK 1.1到13之间,主流JDK版本编译器输出的默认的和可支持的Class文件版本:

参考资料:

  1. https://blog.csdn.net/cold___play/article/details/105325698
  2. https://blog.csdn.net/shendeguang/article/details/18449627

JVM虚拟机-Class文件之魔数相关推荐

  1. 14.VisualVM使用详解、15.VisualVM堆查看器使用的内存不足、19.class文件--文件结构--魔数、20.文件结构--常量池、21.文件结构访问标志(2个字节)、22.类加载机制概

    14.VisualVM使用详解 15.VisualVM堆查看器使用的内存不足 16.性能调优概述 17.性能调优–案例1 18.性能调优-案例三 19.class文件–文件结构–魔数 20.文件结构– ...

  2. JVM虚拟机-Class文件之常量池

    一.常量池的作用 在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项 ...

  3. JVM虚拟机-Class文件之方法表集合

    一.概述 方法表集合与属性表集合的结构类似,是对方法的修饰符.返回类型.方法名.参数个数.参数类型.方法体的描述集合. 方法表集合的结构是一个类似于数组的结构,JVM在对java文件进行编译时,会将类 ...

  4. Java 对上传文件进行魔数校验

    魔数这个词在不同领域代表不同的含义.在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数(magic number):二指程序代码中的魔数,也称魔法值. 不是所有文件都有文件头的.一个.txt类型 ...

  5. Class 文件的魔数和文件版本号

    一 Class 文件数据类型 数 据类型 定义 说明 无符号数 无符号数可以用来描述数字.索引引用.数量值或按照 utf-8 编码构成的字符串值. 其中无符号数属于基本的数据类型. 以 u1.u2.u ...

  6. JVM虚拟机-Class文件之类索引、父类索引和接口索引集合

    一.概述 前面介绍了class文件,包括魔数.次版本号.主版本号.常量池和访问标志.接下来的就是用于确定这个类的继承关系的类索引(this_class).父类索引(super_class)与接口索引集 ...

  7. Java 中文件之魔数

    Java 中令人匪夷所思的 Magic 之魔数 先来讲讲一个故事,公司突然有一个需求,客户提交的文件,让你获取到他提交的文件到底是一个什么文件,这个不是小事一桩吗?直接上代码. public stat ...

  8. JVM虚拟机-Class文件简介

    一.简介 class文件全名称为Java class文件,class文件径打破了C或者C++等语言所遵循的传统,当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运 ...

  9. JVM虚拟机-Class文件之属性表集合

    一.概述 在class文件中,属性表集合包括Java虚拟机预先规范定义的属性以及用户自定义的属性,对于用户自定义的属性,虚拟机加载的时候会自动忽略掉.class文件.字段表.方法表都可以携带自己的属性 ...

最新文章

  1. 对学校的希望和寄语_放飞青春梦,奋斗十四五——2020年福州文教职业中专学校寄宿生联欢晚会...
  2. ubuntu 虚拟机安装
  3. 为什么需要Survivor区?只有Eden不行吗?
  4. MCSE认证全攻略(初、中、高)
  5. SAP Spartacus应用入口的模块加载单步调试
  6. OAuth 2.0 扩展协议之 PKCE
  7. 完整的开发一个ContentProvider步骤
  8. EasyDSS RTMP流媒体解决方案之直播录像自动清理方案
  9. 括号匹配问题(C++、堆栈)
  10. matlab 正交park变换 功率守恒,克拉克(CLARKE)和帕克(PARK)变换.doc
  11. kindle刷机安卓版_亚马逊 kindle 刷机 过程记录
  12. ecshop模板构建说明
  13. 高效扫频水处理器原理介绍
  14. 中职计算机图形图像课程标准,计算机图形与图形图像处理技术的相互结合
  15. 阴阳师夜影诡谈第二天阵容怎么配
  16. BIOS,U-BOOT,BootLoader三者的对比
  17. 知道自己错哪了吗?-整体检查-PCB系列教程1-14
  18. net stop mysql 发生系统错误5
  19. Unity中左右手系转换
  20. android 仿雷霆战机、打飞机等简易u小游戏

热门文章

  1. hive serde 序列化与反序列化 - 一行数据写入hive表
  2. Facebook Graph API(2)--读取数据之picture
  3. 关于子网掩码的是是非非
  4. Reg“.NET研究”exOptions.Compiled的含义和使用
  5. LeetCode 164. 最大间距
  6. android动画框架,GitHub - azhengyongqin/CustomAnimationFramework: Android自定义曲线路径动画框架...
  7. Java多线程与并发 面试十大常考题目。
  8. SpringCloud 从菜鸟到大牛之三 服务拆分 理论
  9. mysql索引为什么使用B+tree,InnoDB与MyISAM 的区别
  10. Shiro系列-Shiro如何实现身份验证