通过二进制头识别文件类型

通过二进制头识别文件类型,可以使用UE或者WinHex软件打开

1.JPEG/JPG
- 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG文件标识) 
- 文件结束标识 (2 bytes): $ff, $d9 (EOI) 

2.TGA
- 未压缩的前5字节   00 00 02 0000
- RLE压缩的前5字节   00 00 10 0000

3.PNG
- 文件头标识 (8 bytes)   89 50 4E 470D 0A 1A 0A

4.GIF
- 文件头标识 (6 bytes)   47 49 46 3839(37) 61
                       G  I  F  8 9 (7)  a

5.BMP
- 文件头标识 (2 bytes)   424D
                       B   M

6.PCX
- 文件头标识 (1 bytes)   0A

7.TIFF
- 文件头标识 (2 bytes)   4D 4D 或 4949

8.ICO
- 文件头标识 (8 bytes)   00 00 01 0001 00 20 20 

9.CUR
- 文件头标识 (8 bytes)   00 00 02 0001 00 20 20

10.IFF
- 文件头标识 (4 bytes)   46 4F 524D
                       F  O  R  M

11.ANI
- 文件头标识 (4 bytes)   52 49 4646
                        R  I  F F

    根据这些文件头标识的收集,我可以写一个识别图像格式的模块了。但是在写这个模块之前可以对收集到的文件头标识进行优化,使得程序中字符串比对次数尽量的少。
1.JPEG我们知需要比对文件头的$ff, $d8这两个字符,而不用读取最后的两个结束标识了。
2.TGA,ICO,CUR只需比对第三个与第五个字符即可。
3.PNG比对[89][50]这两个字符。
4.GIF比对[47][49][46]与第五个字符。

废话不多说了,利用内存流来判断文件的格式,其实判断文件的前几个字节就可以简单的判断这个文件是什么类型的文件,例如

jpg文件 是 FFD8 (从低位到高位就要反过来 D8FF 下面都是一样)

BMP文件 是 424D ---4D42

其他的我就不一一列举了,想知道跟多文件类型分别是用什么字符作为文件的开头的话,下载个C32asm或者UE等这类16进制编辑器就可以看到了。

原文链接:http://zjf30366.blog.163.com/blog/static/41116458201042194542973/

附:常见文件的文件头标识

 

255044PDF 
526563 EML 
D0CF11 PPT 
4D5AEE COM 
E93B03 COM 
4D5A90 EXE 
424D3E BMP 
49492A TIF 
384250 PSD 
C5D0D3 EPS 
0A0501 PCS 
89504E PNG 
060500 RAW 
000002 TGA 
60EA27 ARJ 
526172 RAR 
504B03 ZIP 
495363 CAB 
1F9D8C Z 
524946 WAV 
435753 SWF 
3026B2 WMV 
3026B2 WMA 
2E524D RM 
00000F MOV 
000077 MOV 
000001 MPA 
FFFB50 MP3 
234558 m3u 
3C2144 HTM 
FFFE3C XSL 
3C3F78 XML 
3C3F78 MSC 
4C0000 LNK 
495453 CHM 
805343 scm 
D0CF11 XLS 
31BE00 WRI 
00FFFF MDF 
4D4544 MDS 
5B436C CCD 
00FFFF IMG 
FFFFFF SUB 
17A150 PCB 
2A5052 ECO 
526563 PPC 
000100 DDB 
42494C LDB 
2A7665 SCH 
2A2420 LIB 
434841 FNT 
7B5C72 RTF 
7B5072 GTD 
234445 PRG 
000007 PJT 
202020 BAS 
000002 TAG 
4D5A90 dll 
4D5A90 OCX 
4D5A50 DPL 
3F5F03 HLP 
4D5A90 OLB 
4D5A90 IMM 
4D5A90 IME 
3F5F03 LHP 
C22020 NLS 
5B5769 CPX 
4D5A16 DRV 
5B4144 PBK 
24536F PLL 
4E4553 NES 
87F53E GBC 
00FFFF SMD 
584245 XBE 
005001 XMV 
000100 TTF 
484802 PDG 
000100 TST
414331 dwg 
D0CF11 max

另外还有一些重要的文件,没有固定的文件头,如下: 

TXT 没固定文件头定义 
TMP 没固定文件头定义 
INI 没固定文件头定义 
BIN 没固定文件头定义 
DBF 没固定文件头定义 
C 没没固定文件头定义 
CPP 没固定文件头定义 
H 没固定文件头定义 
BAT 没固定文件头定义 

还有一些不同的文件有相同的文件头,最典型的就是下面: 

4D5A90 EXE 
4D5A90 dll 
4D5A90 OCX 
4D5A90 OLB 
4D5A90 IMM 
4D5A90 IME

参考:http://blog.sina.com.cn/s/blog_6bfe46bc0100q1bx.html

时间: 2025-01-29 17:26:49

通过二进制头识别文件类型的相关文章

PHP取二进制文件头快速判断文件类型的实现代码_php技巧

一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别,PHP扩展中提供了类似 exif_imagetype 这样的函数读取图片类的文件类型,但是很多时候扩展不一定安装了,有时候就需要自己来实现识别文件类型的工作. 下面代码就展示了自己通过读取文件头信息来识别文件的真实类型. 复制代码 代码如下: <?php     $files = array(        'c:\1.jpg',        'c:\1.png',     

文件类型识别-.WPS文档上传的判断为什么不能识别

问题描述 .WPS文档上传的判断为什么不能识别 'application/pdf', 'application/msword', 'application/vnd.ms-works', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ); ......... if(!in_array($file["type"], $uptypes)) //检查文件类型 { echo "文件类型

求解答java通过请求头如何得到文件类型后缀

问题描述 求解答java通过请求头如何得到文件类型后缀 java中,上传一个文件,首先要从文件的请求头中得到文件的内容类型,然后判断文件的扩展名,请知道的大神详细解答! 解决方案 貌似httpservletRequest'类能够获取请求头,查查api有你要的一切 解决方案二: 上传文件,直接从请求体中得到文件的全部信息啊,什么名字,内容,大小都能得到了 解决方案三: 直接使用httprequest就行,具体的方法可以查一下api 解决方案四: 使用commo-fileupload.jar 大概步

php通过文件头检测文件类型通用代码类(zip,rar等)

有时候我们这样做还不完善.可能有些人上存一些文件,但是他通过修改扩展名,让在我们的文件类型之内. 单实际访问时候又不能展示(因为扩展名与文件内容不符).下面这个php类,可能能够给我们带来帮助.一.php检测类 首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可. 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找.如: 代码: 复制代码 代码如下: <?php /*通过文件名,获得文件类型* *@author chengmo* *

mysql 体系结构以及各种文件类型学习汇总

1.mysql体系结构 由数据库和数据库实例组成,是单进程多线程架构. 数据库:物理操作系统文件或者其他文件的集合,在mysql中,数据库文件可以是frm.myd.myi.ibd等结尾的文件,当使用ndb存储引擎的时候,不是os文件,是存放于内存中的文件. 数据库实例:由数据库后台进程/线程以及一个共享内存区组成,共享内存可以被运行的后台线程/进程所共享 2.mysql文件类型 mysql主要文件类型有如下几种: 参数文件:mysql实例启动的时候在哪里可以找到数据库文件,并且指定某些初始化参数

文件类型,c语言文件读写,文件缓冲,文件打开方式,文件操作函数

文件类型分为:流文件和设备文件,设备文件比如:VGA接口,串口,usb口,网口,串口,这些接口都被操作系统抽象成为了文件. 当我们写程序的时候默认已经帮我们打开了三个文件 分别是: stdin:标准输入,stdout:标准输出,stderr:标准出错,scanf实际上接收的是标准输入的数据,这时候的标准输入就是我们的键盘.              有四种方式清空缓冲区:      A.加'\n';            B.程序正常退出;      C.通过fflush(stdout)也可以清

node.js解决获取图片真实文件类型的问题_node.js

遇到一个需求:假定有一个图片文件,真实的类型为jpg,而有人偷懒把jpg直接复制一张,存为同名的png文件,这样在as3读取文件时不会遇到问题,但手机c++在读取文件时却遇到问题了 - -! 现在就需要写一个程序,遍历所有文件夹下的文件,查找文件格式"不正常"的文件.我们的资源主要是gif.png.jpg,最开始,我到网上找到一篇文章:根据二进制流及文件头获取文件类型mime-type,然后读取文件二进制的头信息,获取其真实的文件类型,对与通过后缀名获得的文件类型进行比较. 复制代码

php文件类型对照表

  php文件类型对照表!很方便看出文件是什么类型.如gif是image/gif类型 ie id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd application/octet-stream 5 ico image/x-icon 6 rar application/octet-stream 7 zip application/zip 8 7z application/

linux基础命令(24) Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt. file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多是常规文件(也被称为普通文件 ). 一. 文件类型 Linux文件类型常见的有:普通文件.目录文件.字符设备文件和块设备文件.符号链接文件 等,现在我们进行一个简要的说明. 1. 普通文件 我们用 ls -lh 来查看某个文件的属性,可以看到有类似- rwxrwxrwx,值得