https://blog.csdn.net/ustcyy91/article/details/78462378
https://blog.csdn.net/renfufei/article/details/69938592
一个文件里面的内容到底是啥?用惯了Windows的人肯定是看后缀。但是后缀这个东西说改就改,不可靠。所以,最保险的还是把文件类型信息写到文件里面,通常来说,也就是写到文件开头的那几个字节。这是最方便,最快捷的用来辨别一个文件真实内容的方法。下面举几个例子:
- Java class文件的魔数
每一个Java Class文件都是以0x CAFEBABE开头的。Java这么做的原因就是为了快速判断一个文件是不是有可能为class文件,以及这个class文件有没有受损(文件受损,文件开头受损的可能性最大)。
为什么是CAFEBABE呢?这个只能猜了,首先,16进制里面的字母只有A到F,十分的有限。Java一直以咖啡为代言,CAFEBABE可以认为是 Cafe Babe,读音上和Cafe Baby很近。所以这个也许就是代表Cafe Baby的意思。
- 文本文件的BOM
比如说,对于文本文件,开头的几个字节可以叫做BOM(Byte Order Mark),它的作用是用来标记文本文件内部是用的哪种Unicode编码,以及其字节码顺序。UTF-8,UTF-16BE,UTF-16LE等等各种Unicode编码都有自己独一无二的BOM。一般的文本编辑器也都支持 BOM。这样就不会出现乱码了。
- Zip文件的P.K.
所有的zip文件,都是以PK这两个字母开头的。所以,无论怎么去修改zip文件的后缀,解压程序都可以简单的判断一个文件是不是有可能为zip文件。
不信可以用二进制文本编辑器打开看看,比如notepad++:
PK代表的不是游戏里的Person Kill,而是zip算法(PKZIP算法)的发明者菲尔·卡茨(Phil Katz)名字首字母的缩写。
Phil Katz 在当时也算是个大牛级人物,不想为了一个压缩软件付钱就一跺脚自己写了一个更好的压缩算法,而且还完全无偿开放这个标准。不过,Phil Katz成就了 zip算法,zip算法却没有拯救Phil Katz。zip没有给他带来一分钱,这位无私奉献的工程师生活不顺,死于酗酒,甚至现在连一张像样的照片都流传下来,一声叹息呀。
Java中class
文件的前四个字节为什么是 CAFEBABE
? 是谁定义的?
Java编程语言之父,詹姆斯•高斯林(James Gosling),曾这样说过:
关于这一点,我很抱歉。我以前并不知道有 NeXT connection。这些有趣的十六进制数(HEX words)可能是匹配的来源. 至于在Java中使用CAFEBABE
作为魔数的过程, 说起来有些曲折:
我和小伙伴们经常去一个叫圣米歇尔巷(St Michael’s Alley)的地方吃午餐。根据当地传说, 在深暗的过去,感恩而死乐队(Grateful Dead)在出名前曾在此地表演. 这绝对是一个因 Grateful Dead Kinda Place 而闻名的地方。杰瑞(Jerry)去世时, 他们进行了祭奠.我们经常去那里, 称这个地方为 死亡咖啡(Cafe Dead)。
可以看到,这是一个十六进制数. 那时候我正好需要维护一些文件的编码格式,需要用到两个魔数(magic numbers): 一个用于对象持久化文件, 另一个用于类文件. 于是我就用 CAFEDEAD
作为对象持久化文件的魔数, 当然,这两个魔数有着共同的前缀: 4个十六进制字符(CAFE
, Java和咖啡有一段深沉的虐恋), 我选中了BABE
(宝贝),于是不知道为什么洪荒之力就爆发了[鬼知道我都经历了些什么,>2016年8月17日<]。
当时, 这个魔数并没有什么特别的意义, 也看不出来有什么重要的, 或许很快就会消失在历史中。所以 CAFEBABE 成为 class 文件的魔数, CAFEDEAD 成为持久对象的魔数. 但没多久持久化对象(persistent object)技术真的消失了, 就如同魔数 CAFEDEAD 所蕴含的一样 —— 后来用的是RMI技术。