二进制文件怎样被解读?扩展名?或是文件头。
下面是一些你可能不知道的事实:
1. jar、jra和zip是一样的。
不信大家可以测试:把jar或者jra(不知道这是什么东东的自己百度)用WinRAR打开,然后解压出来。把解压后的东西打包成zip,然后把后缀改回jar或jra,放回手机安装。如果打出的zip包版本适当的话是绝对可以成功安装的。
2. jpg、png、gif、bmp是完全不同的。
把gif的图片后缀改名为jpg还能正常显示,是因为jpg和gif的解析方法很相似??!!那么bmp和jpg呢?你也说它们很相似??别开玩笑了,只要看一看尺寸和内容完全相同的jpg和bmp图片占用的空间那MB级的差距,就知道两者完全不同了。
可是为什么,当我们把bmp改成jpg时,我们的手机却还能够正常显示它呢?或许,除了扩展名,这些文件还有其他“表示自己身份”的方式吧。
是的,你猜对了。确定二进制文件格式的不仅只有扩展名,还有文件开头的几个字节,我们称它们为“文件头”。
zip压缩文件的文件头是最有意思的,如果你用记事本打开它,会发现它的开头两个字节是英文字母PK(不要误会,其实是pack的缩写,“打包”的意思)。当WinRAR遇到开头为PK的文件时(你得指定文件用WinRAR打开,文件被其他软件打开了的情况不算),不管这个文件的后缀是zip、jar、rar,还是dat、mrp,甚至没有后缀,它都会认为这是一个zip压缩文件,然后采用zip的解压规则浏览文件,解压文件。当然,遇到虽然开头是PK但是之后的内容不符合zip规范的文件(比如你恶作剧写下的以PK开头的一段文字),它也会报出“压缩包已损坏”的错误(遇到不认识的文件头它也这样报错就是了)。
再举另外一个例子:在手机上,你把mp4改后缀为3gp可能就无法播放了。但是如果你在电脑上尝试,结果却完全不同。你用暴风影音能打开的mp4,改后缀成3gp后用暴风影音仍然能正常播放,甚至改mp3后用暴风影音播放仍然有图像。你对扩展名的修改无法瞒过暴风影音,是因为无论你怎么改后缀,暴风影音都会发现:这文件怎么看怎么像一个mp4啊,于是就用mp4的方式解码了。
一个好的播放器,是不应该仅仅依靠扩展名来判断二进制文件类型的。
并非所有二进制文件都有文件头,或者只有一个文件头。像mp3文件,它的头信息(被称为桢头)在文件中广泛存在着,所以mp3即使损坏了一部分也没关系,播放软件完全可以跳过这一段寻找下一个桢头并接着播放。
文件头并不是必须的,但很多情况下没有文件头是万万不能的。139社区的缩略图生成器之所以能够成功生成伪装成png文件的bmp的缩略图,就是文件开头的两个固定为BM的字节所致。
而事实上,139的上传程序以前是明确表示支持bmp的,后来对bmp的禁止也只是去检查扩展名,而没有去检查文件头。
我们的“伪装文件头5B/35B”通道也正是基于文件头伪装的原理,但是伪装总是会被识破的,就像我写的以PK开头的文字永远不可能解压出一个文件一样。
不过呢,139想识破我们bmp的伪装,等它去掉bmp的识别模块和缩略图生成模块时再说吧。
附录:各种文件的文件头
zip:字母PK
bmp:字母BM
gif:字母GIF87a或GIF89a
png:十六进制89 50 4E 47 0D 0A 1A 0A
jpg:十六进制FF D8
mrp:字母MRPG
sky电子书(冒泡书城):字母skybook
………
其实,文本文件也可能有一个文件头,详情请搜索“Unicode签名”。