上QQ阅读APP看书,第一时间看更新
3.2.3 魔数
很多文件格式都会规定满足该格式的文件必须以某几个固定字节开头,这几个字节主要起标识作用,叫作魔数(magic number)。例如PDF文件以4字节“%PDF”(0x25、0x50、0x44、0x46)开头,ZIP文件以2字节“PK”(0x50、0x4B)开头。class文件的魔数是“0xCAFEBABE”。readAndCheckMagic()方法的代码如下:
func (self *ClassFile) readAndCheckMagic(reader *ClassReader) { magic := reader.readUint32() if magic ! = 0xCAFEBABE { panic("java.lang.ClassFormatError: magic! ") } }
Java虚拟机规范规定,如果加载的class文件不符合要求的格式,Java虚拟机实现就抛出java.lang.ClassFormatError异常。但是因为我们才刚刚开始编写虚拟机,还无法抛出异常,所以暂时先调用panic()方法终止程序执行。用classpy打开ClassFileTest.class文件,可以看到,开头4字节确实是0xCAFEBABE,如图3-1所示。
图3-1 用classpy观察魔数