java-文件类型-文件类型判断
来源:互联网 发布:三国志9优化伴侣版本 编辑:程序博客网 时间:2024/04/29 15:58
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
- java-文件类型-文件类型判断
- Java判断文件类型
- Java判断文件类型
- Java判断文件类型
- Java判断文件类型
- Java判断文件类型
- java判断文件类型
- Java判断文件类型
- java根据文件名称判断文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- C++学习之路(vector::clear和vector::erase的区别)
- Java 线程与并发研究系列二(实现Callable接口)
- Cocos2dx中如何让runAction函数执行完后再执行后续程序
- JS格式化银行卡号
- Linux内核中的atoi,itoa等函数
- java-文件类型-文件类型判断
- CI框架中使用cookie的三种方式
- python杂乱笔记【命令行帮助&格式化字符串&seek函数】
- openg 立方体纹理
- 笨方法学python 有用的Tips
- CodeForces 425E Sereja and Sets
- UVa11567 - Moliu Number Generator(记忆化搜索dfs)
- 连接Siemens PLC的常用方式(一)
- 正则表达式语法