电脑里很多文件,例如,word,excel,txt,jpg,应用软件怎么区分文件类型呢?

即使word文档,也是分为doc和docx,编码格式都不一样,office也需要区分不同的类型,再进行解码。

如果把一个word文档的后缀改成jgp,图片软件打开的时候就会报错。但是文件后缀是可以随便更改的,为了规范化,除了文件后缀之外,还需要一个方法来表示文件真正的类型。

魔数(magic number),因此而出现,魔数用于表示不同的文件类型。

在文件开头预留几个字节,存入魔数,应用软件在打开这个文件的时候,就能判断是否是支持的文件类型了。

比如,一个JPEG文件,它开头的一些字节可能是类似这样的”ffd8 ffe0 0010 4a46 4946 0001 0101 0047 ……JFIF…..G“,这里” ffd8 “就表示了这个文件是一个JPEG类型的文件,” ffe0 “表示这是JFIF类型结构。
魔数作用非常大:

1,有些文件没了后缀,需要先找到具体的类型,修改后缀才能打开。

2,文件操作中为了兼容错误,出现一些异常。例如一个word文档,本来是doc格式,兼容保存为docx后缀,但是实际上格式没变。用office或者wps打开是没问题的,但是自己写代码做点功能的时候,就会遇到问题。

3,web网站文件上传,用户可以将一些可执行的文件更改后缀传输上来,再通过其他办法修改为可执行,这样就是一个安全漏洞了。

文件类型 扩展名 16进制数字
xx这里表示变量
Ascii数字
. = 不是Ascii字符
Bzip .bz 42 5a BZ
Compress .Z 1f 9d ..
gzip format .gz 1f 8b ..
pkzip format .zip 50 4b 03 04 PK..

其他文件有自己的魔数,不一一表述了。

判断方法:

1,设置文件输入流。

2,读取前几个字节,获得魔数,以16进制表示。

3,对比,判断类型。

具体的代码实现:

public static void test() { String fileType = getFileType("E:\\xx.xls"); System.out.println(fileType); // 缓存文件头信息-文件头信息 public static final HashMap<String, String> mFileTypes = new HashMap<String, String>(); static { // images mFileTypes.put("FFD8FF", "jpg"); mFileTypes.put("89504E47", "png"); mFileTypes.put("47494638", "gif"); mFileTypes.put("49492A00", "tif"); mFileTypes.put("424D", "bmp"); mFileTypes.put("41433130", "dwg"); // CAD mFileTypes.put("38425053", "psd"); mFileTypes.put("7B5C727466", "rtf"); // 日记本 mFileTypes.put("3C3F786D6C", "xml"); mFileTypes.put("68746D6C3E", "html"); mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件 /** Microsoft Word/Excel 注意:word 和 excel的文件头一样 */ mFileTypes.put("D0CF11E0", "doc"); mFileTypes.put("D0CF11E0", "xls");//excel2003版本文件 /** Microsoft Word/Excel 2007以上版本文件 注意:word 和 excel的文件头一样 */ mFileTypes.put("504B0304", "docx"); mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件 mFileTypes.put("5374616E64617264204A", "mdb"); mFileTypes.put("252150532D41646F6265", "ps"); mFileTypes.put("255044462D312E", "pdf"); mFileTypes.put("52617221", "rar"); mFileTypes.put("57415645", "wav"); mFileTypes.put("41564920", "avi"); mFileTypes.put("2E524D46", "rm"); mFileTypes.put("000001BA", "mpg"); mFileTypes.put("000001B3", "mpg"); mFileTypes.put("6D6F6F76", "mov"); mFileTypes.put("3026B2758E66CF11", "asf"); mFileTypes.put("4D546864", "mid"); mFileTypes.put("1F8B08", "gz"); * 方法描述:根据文件路径获取文件头信息 * @param filePath 文件路径 * @return 文件头信息 public static String getFileType(String filePath) { // System.out.println(getFileHeader(filePath)); // System.out.println(mFileTypes.get(getFileHeader(filePath))); String fileHeader = getFileHeader(filePath); return mFileTypes.get(fileHeader); * 方法描述:根据文件路径获取文件头信息 * @param filePath 文件路径 * @return 文件头信息 public static String getFileHeader(String filePath) { FileInputStream is = null; String value = null; try { is = new FileInputStream(filePath); byte[] b = new byte[4]; * int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length * 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len) * 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 is.read(b, 0, b.length); value = bytesToHexString(b); } catch (Exception e) { } finally { if (null != is) { try { is.close(); } catch (IOException e) { return value; * 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示 * @param src 要读取文件头信息的文件的byte数组 * @return 文件头信息 private static String bytesToHexString(byte[] src) { StringBuilder builder = new StringBuilder(); if (src == null || src.length <= 0) { return null; String hv; for (int i = 0; i < src.length; i++) { // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写 hv = Integer.toHexString(src[i] & 0xFF).toUpperCase(); if (hv.length() < 2) { builder.append(0); builder.append(hv); // System.out.println(builder.toString()); return builder.toString(); 魔数 简介: 在识别 文件类型 时,我们很多人都是通过 文件 的后缀来识别的,如苍老师.mp4, 波老师.avi, 玛利亚.jpg。 使用后缀名识别 文件类型 不是特别准确,尤其是后缀民可以手动修改的情况下。 另外一种识别 文件 名的方式是: 利用 文件 的头部信息中的标记,我们称这个标记为 魔数 。也许这个解析不是特准确,但它对识别 文件类型 比较准确。 常见 文件类型 魔数 表: 本文介绍了基于 文件 魔数 判断 文件类型 的方法,主要涉及如何ReadSeek读取 文件 指定字节内容,然后介绍 文件 魔数 ,最后给出示例基于 魔数 判断 文件类型 。参考代码:https://github.com/telkomdev/go-filesig。 魔众SC++RM私域运营平台发布v3.0.0版本,新功能和Bug修复累计28项,内核升级,系统更强。 2021年10月26日魔众SC++RM私域运营平台发布v3.0.0版本,增加了以下28个特性: [新功能] 前端架构升级,更好的适配和更高的性能 [新功能] 用户增加用户统计功能 [新功能] 调整模块信息注册方式(延迟加载,提高系统响应性能) [新功能] 修复轮播不可点击问题 [新功能] 增加模块市场 [新功能] 导航栏增加打开方式(新窗口、当前窗口) [新功能] 权限系统全新升级 [新功能] 增加未安装自动跳转到安装链接 [新功能] 生效首页切换器 [新功能] 升级到ModStart1.4.0 [新功能] 模块任务调度器ScheduleProvider [新功能] 文件 选择增加反转 文件 顺序 [新功能] 用户增加禁用功能 [新功能] 页面设计增加页面自定义样式 [新功能] 页面设计部分组件增加每行显示个数配置 [新功能] 轮播支持视频背景 类型 魔众SC++RM私域运营平台,一站式私域流量运营平台。 魔数 这个词在不同领域代表不同的含义。在计算机领域, 魔数 有两个含义,一指用来判断 文件类型 魔数 ;二指程序代码中的 魔数 ,也称魔法值。判断 文件类型 魔数 很多 类型 文件 ,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。因此这几个字节的内容也被称为 魔数 (magicnumber),因为根据这几个字节的内容就可以确定 文件类型 。FreeBSD上ELF 文件 的magicnumber就是 文件 的前四个字节依次为"7f454c46",对应的ascii字符串即“^?ELF”。或者。...... oop-klass模型 我们都知道C语言执行依赖编译器,同一段C程序,在不同的操作系统平台(或者说是硬件平台上)上,由不同的编译器将其编译成对应的机器指令,编译后的C程序里各种数据 类型 信息都被改写成汇编,这是在编译时期完成的,在编译器对C程序进行解析时,识别里面的各种数据 类型 ,例如结构体,并翻译成机器可以理解的二进制程序,待操作系统加载执行。Java则不同,JIT即时编译器虽然也能在编译时识别出Java程序中的各种数据 类型 信息,但是还记...   可执行与可链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行 文件 、目标代码、共享库和核心转储(core dump)的标准 文件 格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。比如它支持不同的字节序和地址范围,所以它不会不兼容某一特别的 CPU 或指令架构。这也使得 ELF 格式能够被运行于众多不同平台的各种操作系统所广泛采纳。 其实这与kkFileView的预览机制有关系,kkFileView预览是通过下载地址的 文件 后缀名去判断 文件类型 ,但Cloudreve生成的下载链接 文件 名是一串随即字符且不包括 文件 后缀,所以kkFileView在处理时不知道对应的 文件类型 ,导致预览失败。注意:office和wps下的相关 文件 (docx、xlsx、pptx)的 魔数 都一样,所以大家可以默认设置成其中一种即可(我默认的是xlsx),kkFileView预览office相关 文件 依赖的是OpenOffice和LibreOffice。 将upload压缩 文件 解压后,复制到tomcat安装目录\webapp目录中,然后启动tomcat,在浏览器地址栏中输入http://localhost:8080/upload/upload.jsp 上传 文件 保存在D:\upload 文件 夹下 这里所说的表示不同 文件类型 的魔术数字,指定是 文件 的最开头的几个用于唯一区别其它 文件类型 的字节,有了这些魔术数字,我们就可以很方便的区别不同的 文件 ,这也使得编程变得更加容易,因为我减少了我们用于区别一个 文件 文件类型 所要花费的时间。 比如,一个JPEG 文件 ,它开头的一些字节可能是类似这样的”ffd8 ffe0 0010 4a46 4946 0001 0101 0047 ……JFIF…..G“, 文件 上传功能是很多网站都必须的功能,而判断 文件类型 不仅可以过滤 文件 的上传,同时也能防范用户上传恶意的可执行 文件 和脚本,以及将 文件 上传服务器当作免费的 文件 存储服务器使用。 而对于上传 文件 来说,不能简单的通过后缀名来判断 文件 类型 ,因为恶意攻击可以将可执行