欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

通过文件头标识判断文件格式(转)改了后缀名 判断真正的 jpg jpeg png gif 等 有大用

shiping1 的头像
  • image.png 这里去掉扩展名就可以看到JPG了  去掉扩展名用记事本打开 最前面的几个字母就是真正的格式?

  • image.png去掉扩展名 用记事本打开image.png



image.png

image.png


     16进制视图下

      JPEG (jpg),文件头:FF D8 FF E0 00 10 4A 46 49 46
    PNG (png),文件头:89 50 4E 47 0D 0A 1A 0A
    GIF (gif),文件头:47 49 46


image.png


  • 使用 emeditor 的二进制打开

  • 过文件的二进制流来判断一张图片是否为jpg格式的图片。

  • 原理很简单:所有JPG/JPEG格式的图片都是以十六进制的'FF D8'作为文件开始,'FF D9'作为文件结束标志。FF等为16进制数据,占文件的1 byte。如果没有带相机信息的jpg图片,第7, 8, 9, 10这4位上分别是字符'JFIF'的16进制表示,用UltraEdit打开可以直接看到;如果带有相机信息,有可能与不带信息的不同,也可能相同,不同的话在那4位上为'Exif'字符的16进制表示,但是他们都是以FF D8开始,FF D9结束

image.png

通过文件头标识判断文件格式(转)

(2011-04-16 13:47:26)
标签:

杂谈

分类: IT技术相关

最近在做东西的时候遇到了点问题,在加载图片的时候,加载失败,后缀都是jpg格式,但换个图片就可以了,为此,怀疑图片格式有问题,遂拖到UE里面查看它的16进制,果然,两个图片的文件头根本就不一样,这不是欺负人嘛,害我白白浪费了半天的时间,差点要重新编译内核。

然后到网上找了一些资料,查看不同格式图片的文件头是怎样的。下面转帖是不同图片的文件头标志:

 

 

图片的格式很多,一个图片文件的后缀名并不能说明这个图片的真正格式什么,那么如何获取图片的格式呢?我想到了几个简单但有效的方法,那就是读取图片文件的文件头标识。我们知道各种格式的图片的文件头标识识不同的,因此我们可以通过判断文件头的标识来识别图片格式。
    我对各种格式的图片文件头标识进行了分析,不仅查找资料,也用十六进制编辑器察看过图片的文件头,以下是我收集、分析的结果,供大家参考。

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

image.png



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

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

image.png



4.GIF
- 文件头标识 (6 bytes)  47 49 46 38 39(37) 61
                          9 (7)  a


image.png
5.BMP
- 文件头标识 (2 bytes)  42 4D
                        M

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

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

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

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

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

11.ANI
- 文件头标识 (4 bytes)  52 49 46 46
                          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/

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

 

255044 PDF 
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

普通分类: