在.NetCore中使用Myrmec检测文件真实格式
Myrmec 是什么?
Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能使用虚假的扩展名欺骗你的应用程序),Myrmec会检测文件的二进制头,并在其元数据库中匹配来获得文件的格式。
例如Jpg图片的二进制头是 "FF D8 FF DB" 那么Myrmec会匹配到这个文件头,并获得两个结果--"jpg"和"jpeg"。
如何使用
首先安装 nuget 包
Install-Package Myrmec
或者通过 DotnetCli
dotnet add package Myrmec
编写匹配代码
// 创建嗅探器
Sniffer sniffer = new Sniffer(); // 使用元数据填充嗅探器
sniffer.Populate(FileTypes.CommonFileTypes); // 获取要匹配文件的文件头,一般20个字节就够了,有的格式可能需要更长
byte[] fileHead = ReadFileHead(); // 匹配并获取结果
List<string> results = sniffer.Match(fileHead)
为什么结果是List<String>?
许多时候一个文件格式会对应多个扩展名,比如jpg。还有的时候多种文件格式都是一种文件格式,比如 zip、apk、pptx 它们都是zip achive ,所以当你匹配了一个zip文件,那么你最少会获得3个扩展名。当结果是空时,说明没有匹配到结果。
查询多个结果或者一个
会有这样的情况:文件格式A 的文件头是 "ff,11,22" ,文件格式B 的 文件头是“ff,11,22,33”,这时候你要匹配的文件头是"ff,11,22,33,44",那么它最多会匹配到这两个结果,并返回他们包含的所有扩展名
// 这会在匹配到第一个结果时就返回
// default is false
List<string> results = sniffer.Match(fileHead,false); // 这会匹配到所有的结果
List<string> results = sniffer.Match(fileHead,true);
添加自定义的文件头
也许你创建了一种文件格式,或者你所使用的文件格式不在元数据中,这时你可以使用下面的代码将其加入元数据:
var data = new byte[]
{
0x11,
0x22,
0x33
};
sniffer.Add(data, new[] { "what", "file", "type" });
注意这个新添加的格式拥有3个扩展名。
获取MimeType
List<string> result = sniffer.Match(head);
string mimeType = MimeTypes.GetMimeType(result.First());
或者
string mimeType = MimeTypes.GetMimeType("png");
在下一个版本中,获取MimeType将会被替换成string 的扩展方法。
元数据来源
元数据来自维基百科 List of file signatures.
RoadMap
接下来要做的事就是支持 带有偏移量的 文件格式,例如
ff,,ff 起始偏移10字节
以及 ,ff,??,??,??,,??,fd 这种含有跳跃的文件格式。
不过事实上他们两个是一种形式,预计下一个版本就会发布对其的支持。
支持 .net standard.现在是.net core 2,在未来会调整到.net standard
github地址:https://github.com/rocketRobin/myrmec
nuget地址:https://www.nuget.org/packages/Myrmec/
欢迎大家试用,提出意见与建议
为什么github仓库是英文的?
作为一个中文开发者,我没有在github仓库中使用中文,因为我希望能够长久的开发这个项目,并希望世界各地的开发者都能使用这个库,或者参与开发,为了此目的,我在github上使用的是英文。
在.NetCore中使用Myrmec检测文件真实格式的更多相关文章
- NetCore中使用Myrmec
NetCore中使用Myrmec Myrmec 是什么? Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能 ...
- c# 根据文件流查看文件真实格式
今天在做图片注册的功能的时候,测试提出一个问题:将随便一个非图片文件将后缀名改为jpg或其他,上传时应检验图片合法性.然后同事给提供了根据文件流前两个字节判断文件真实格式的思路,代码如下: publi ...
- 工作笔记——限定input上传文件对话框中能选取的文件的格式
原文:http://www.dengzhr.com/frontend/1059 input[file]标签的accept属性可用于指定上传文件的 MIME类型 . 例如,想要实现默认上传图片文件的代码 ...
- .NET中检测文件是否被其他进程占用
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 一.检测文件是否被进程占用的几种方式 在.NET中主要有以下方式进行检测文件是否被进程占用的几种方式: 通过直接打开文件等 ...
- C++之检测文件结尾
当使用文件作为输入流时,为了确保适时的结束文件读取操作,程序要靠检查文件尾来判断该何时停止读取.常用的检查文件尾方法有两种: 两种方式均已将 fin 与文件关联,即 均已声明 fin 输入流,并已调用 ...
- Linux中/proc目录下文件详解
转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...
- C语言中 *.c和*.h文件的区别!
C语言中 *.c和*.h文件的区别! http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/ ...
- Visual Studio 中可执行文件中嵌入的清单文件
概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...
- 使用c#检测文件正在被那个进程占用 判断文件是否被占用的两种方法
C# 判断文件是否被占用的三种方法 using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.d ...
随机推荐
- 解决get乱码
也可以在tomcat中修改,但是每次配置tomcat中都得修改.容易忘记,还是图片这个方法最好,推荐
- nth-child()选择器小结
之前也用到过nth-child,只是当时理解的不够透彻.今天回过头去看这个知识点时,发现了一个易错点. 浏览器支持情况: 所有主流浏览器都支持nth-child()选择器,除了IE8及更早的版本. 下 ...
- Oracle_view视图
Oracle_view视图 视图view --视图:view --查询班级信息并统计各班的人数 select * from stu; select * from clazz; select c ...
- vim&vi在编辑的时候突然卡死,不接收输入问题的解决
多方查找无果,看了官方解释如下: "CTRL-S and CTRL-Q are called flow-control characters. They represent an antiq ...
- 如何更改Linux的ssh端口
1. 修改/etc/ssh/sshd_config里的Port字段 Port 22改为Port 1000(你自定义的端口) 2. 重启sshd服务 #service sshd restart
- vi的常用命令
https://zhidao.baidu.com/question/332242228.html vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ v ...
- 手机WebApp是什么?
手机WebApp是基于HTML5+css3开发的,一次开发,可以兼容许多的平台(android/iphone),调用本地功能(比如照相),可以用phonegap去实现,所以,是一个趋势.相比每个平台定 ...
- iphone开发笔记目录
http://www.cnblogs.com/syxchina/archive/2012/10/20/2732731.html#2653802
- jsp中${}
jsp中${}----是EL表达式的常规表示方式目的是为了获取{}中指定的对象(参数.对象等)的值 如:${user.name}<====>User user = (User)reques ...
- 新装Centos7.2 配置防火墙
1.安装 yum -y install firewalld2.开机启动 systemctl enable firewalld3.设置防火墙规则 systemctl restart firewalld ...