电脑里很多文件,例如,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“,
文件
上传功能是很多网站都必须的功能,而判断
文件类型
不仅可以过滤
文件
的上传,同时也能防范用户上传恶意的可执行
文件
和脚本,以及将
文件
上传服务器当作免费的
文件
存储服务器使用。
而对于上传
文件
来说,不能简单的通过后缀名来判断
文件
的
类型
,因为恶意攻击可以将可执行