java-文件类型-文件类型判断

来源:互联网 发布:三国志9优化伴侣版本 编辑:程序博客网 时间:2024/04/29 15:58
摘要:1.文件类型的判断:最直接的方法通过文件的后缀名字可以知道文件类型,可是一些黑客会将病毒代码的后缀修改,以此来欺骗用户。2.文件类型的判断方法:直接读取文件的前2个字节即可判断文件类型。3.二进制文件和ascii文件的区别。4.MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。

1.文件类型的判断主要用于病毒的检测。

2.文件类型的判断方法:读取文件的前两个字节即可判断文件的类型。(java实现代码:参考:http://blog.csdn.net/honwellhsueh/article/details/12913591)

3.计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件):

ASCII文本:ASCII字符构成的文本,而不是其它编码方式所构成。

只含有用标准ASCII字符集编码的字符的数据和文本文件。文本文件(如字处理文件、批处理文件和源语言程序)通常都是ASCII文件,因为它们只含有字母、数字和常见的符号。SMTP只能传输ascii文件。


文件可以看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成,根据数据的组织形式,可分为:ASCII和二进制文件,ASCII文件又称为文本文件,它的每个字节放一个ACSII代码,代表一个字符。二进制文件时把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,一个整数10000,在内存中占两个字节,如果按ASCII码输出,则占五个字节。按二进制形式输出,在磁盘上占两个字节。如下图所示:


4.MIME:

最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型

根据文件内容前几个字节,判断文件类型,需要查看MIME type 查看,文件传输是是二进制,可以知道,通过前几个字节可以知道文件文件类型,文件类型的判断不能通过后缀名来判断,有可能会改后缀名。???上传文件时经常需要做文件类型判断,例如图片、文档等,普通做法是直接判断文件后缀名,而文艺青年为了防止各种攻击同时也会加上使用文件头信息判断文件类型。原理很简单:用文件头判断,直接读取文件的前2个字节即可。

5.还是文件类型的判断,文件类型判是通过读取文件的前几个字节来判断的。原理:

(1)将常用文件类型的前几个字节读取出来,转换成十六进制字符串。每个字节进行

    int v = src[i] & 0xFF;  
            String hv = Integer.toHexString(v);    //将int数字转换成16进制表示的字符串

要先和0xFF做一次与运算。这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉,这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位,需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了。 (参考自:http://xiaowei-qi-epro-com-cn.iteye.com/blog/1927851)

Tips:其实不一定非得是表示成16进制字符串,也可以自己以十进制或者其他的表示。(个人猜测)

(2)将常用的文件类型的16进制文件头信息建立一个hashmap。

Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();

key就是我们的十六进制数,value就是我们的文件类型。通过读取文件前几个字节。

(如果想知道一个文件类型的16进制字符串的话,可以自己用程序去实现)。

(3)第一步转换出来得16进制字符串type,在hashmap中进行遍历,找到这个key,如果这个key,如果key startwith 16进制type则说明这个文件就是key对应value的类型。

(4)到底是读取多少位就可以表示文件的类型啦。有些读取前四个字节就可以区别出来,然后有些文件读取前四个字节是不行,例如apk文件如果读取前四个字节的话,读取出来的类型是zip。如果读取5个字节的话,就可以和zip区分开。(具体多少位,的看自己的文件类型)粗略的区别很好做。

(5)关于读取前几个字节读取文件内容前几个字节的区别,如果以字节方式直接读取文件内容的前几个字节。会不会和判断文件的类型读取的数据一样那,这个还没有进行验证,等需要使用的时候再去验证吧,估计是不一样的,因为一个文件类型的,读取不同的文件的,前几个字节是一样。

(6)下边常见的文件头信息16进制表示。当我读取文件的前四个字节的时候返回的一定是8位的十六进制数,当我们读取的是10个字节的时候返回的一定是20位的十六进制数。这样的话我们可以使用startwith来判断是否是这个文件类型,但是hashmap中的key必须是10字节。因为

String str="abcd";
String str1="ab";
System.out.println(str1.startsWith(str));//结果为false

如果读取文件时,是10个字节,但是我们的key是4个字节,一个短的字符串不可以能以一个长的字符串开头


附常见文件的文件头信息

常见文件的文件头(十进制)

jpg: 255,216

gif: 71,73

bmp: 66,77

png: 137,80

doc: 208,207

docx: 80,75

xls: 208,207

xlsx: 80,75

js: 239,187

swf: 67,87

txt: 70,67

mp3: 73,68

wma: 48,38

mid: 77,84

rar: 82,97

zip: 80,75

xml: 60,63

常用文件的文件头如下(16进制)

JPEG (jpg),文件头:FFD8FF

PNG (png),文件头:89504E47

GIF (gif),文件头:47494638

TIFF (tif),文件头:49492A00

Windows Bitmap (bmp),文件头:424D

CAD (dwg),文件头:41433130

Adobe Photoshop (psd),文件头:38425053

Rich Text Format (rtf),文件头:7B5C727466

XML (xml),文件头:3C3F786D6C

HTML (html),文件头:68746D6C3E

Email [thorough only] (eml),文件头:44656C69766572792D646174653A

Outlook Express (dbx),文件头:CFAD12FEC5FD746F

Outlook (pst),文件头:2142444E

MS Word/Excel (xls.or.doc),文件头:D0CF11E0

MS Access (mdb),文件头:5374616E64617264204A

WordPerfect (wpd),文件头:FF575043

Postscript (eps.or.ps),文件头:252150532D41646F6265

Adobe Acrobat (pdf),文件头:255044462D312E

Quicken (qdf),文件头:AC9EBD8F

Windows Password (pwl),文件头:E3828596

ZIP Archive (zip),文件头:504B0304

RAR Archive (rar),文件头:52617221

Wave (wav),文件头:57415645

AVI (avi),文件头:41564920

Real Audio (ram),文件头:2E7261FD

Real Media (rm),文件头:2E524D46

MPEG (mpg),文件头:000001BA

MPEG (mpg),文件头:000001B3

Quicktime (mov),文件头:6D6F6F76

Windows Media (asf),文件头:3026B2758E66CF11

MIDI (mid),文件头:4D546864



0 0
原创粉丝点击