NetCore中使用Myrmec
NetCore中使用Myrmec
Myrmec 是什么?
Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能使用虚假的扩展名欺骗你的应用程序),Myrmec会检测文件的二进制头,并在其元数据库中匹配来获得文件的格式。
例如Jpg图片的二进制头是 "FF D8 FF DB" 那么Myrmec会匹配到这个文件头,并获得两个结果--"jpg"和"jpeg"。
如何使用
首先安装 nuget 包
Install-Package Myrmec
或者通过 DotnetCli
dotnet add package Myrmec
编写匹配代码

1 // 创建嗅探器
2 Sniffer sniffer = new Sniffer();
3
4 // 使用元数据填充嗅探器
5 sniffer.Populate(FileTypes.CommonFileTypes);
6
7 // 获取要匹配文件的文件头,一般20个字节就够了,有的格式可能需要更长
8 byte[] fileHead = ReadFileHead();
9
10 // 匹配并获取结果
11 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",那么它最多会匹配到这两个结果,并返回他们包含的所有扩展名

1 // 这会在匹配到第一个结果时就返回
2 // default is false
3 List<string> results = sniffer.Match(fileHead,false);
4
5 // 这会匹配到所有的结果
6 List<string> results = sniffer.Match(fileHead,true);

添加自定义的文件头
也许你创建了一种文件格式,或者你所使用的文件格式不在元数据中,这时你可以使用下面的代码将其加入元数据:

1 var data = new byte[]
2 {
3 0x11,
4 0x22,
5 0x33
6 };
7 sniffer.Add(data, new[] { "what", "file", "type" });

注意这个新添加的格式拥有3个扩展名。
获取MimeType
1 List<string> result = sniffer.Match(head);
2 string mimeType = MimeTypes.GetMimeType(result.First());
或者
1 string mimeType = MimeTypes.GetMimeType("png");
在下一个版本中,获取MimeType将会被替换成string 的扩展方法。
元数据来源
元数据来自维基百科 List of file signatures.
RoadMap
接下来要做的事就是支持 带有偏移量的 文件格式,例如
ff,11,ff 起始偏移10字节
以及 11,ff,??,??,??,11,??,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检测文件真实格式
Myrmec 是什么? Myrmec 是一个用于检测文件格式的库,Myrmec不同于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户很可能使用虚假的扩展名欺骗你的应用程序) ...
- .NetCore中的日志(2)集成第三方日志工具
.NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...
- .NetCore中的日志(1)日志组件解析
.NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...
- AutoMapper在asp.netcore中的使用
# AutoMapper在asp.netcore中的使用 automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,htt ...
- netcore中的缓存介绍
Cache(缓存)是优化web应用的常用方法,缓存存放在服务端的内存中,被所有用户共享.由于Cache存放在服务器的内存中,所以用户获取缓存资源的速度远比从服务器硬盘中获取快,但是从资源占有的角度考虑 ...
- 在netcore中如何注入同一个接口的多个实现
netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...
- .NetCore中EFCore的使用整理(二)-关联表查询
EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core 1.1 1.当前的版本,还不支持延迟加载(Lazy ...
- .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql
一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...
- .NetCore中如何实现权限控制 基于Claim角色、策略、基于Claim功能点处理
.NetCore中如果实现权限控制的问题,当我们访问到一个Action操作的时候,我们需要进行权限控制 基于claims 角色控制 基于角色控制总觉得范围有点过大,而且控制起来感觉也不是太好,举一个例 ...
随机推荐
- Linux_学习_02_ 重启tomcat与查看tomcat日志
一.重启tomcat服务器 cd /home/ehlhec/tomcat_dingtalk/bin ./shutdown.sh ps -ef|grep java ./startup.sh (1) 进入 ...
- MAC OS Sierra 10.12.6 下对固态硬盘SSD 开启TRIM功能
这个是对于不是mac原装SSD的情况下才做的操作... 大家都知道,苹果店卖的SSD硬盘那怕就是一个256G的也要1000多人民币,而市场上的也就400-500左右人民币,整整少了一半还要多,可见JS ...
- kettle结合MySQL生成保留最近6个月月度报告_20161009
之前计算用户ID各月的金额(各月在列字段),用的是下面代码 ,b.金额,,b.金额,,b.金额,NULL)) AS 9月金额 FROM ( SELECT city AS 城市,DATE_FORMAT( ...
- 洛谷 1344 [USACO4.4]追查坏牛奶Pollutant Control——最大流
题目:https://www.luogu.org/problemnew/show/P1344 那个边数的限制,只要把边权乘1001再+1即可.乘1001是因为有1000条边,这样流量小的不会因为边数多 ...
- HDOJ-2153
仙人球的残影 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- WPF命令使用
What 命令包含以下部分: 命令:一个实现了ICommand接口的类,RoutedCommand是WPF里最常用的命令类,其它命令类大多派生自RoutedCommand 命令源:触发命令的对象,如b ...
- 使用API修改控制台输出的颜色(前景色和背景色)
1.api原型 SetConsoleTextAttribute BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, // ...
- 【hdu4570】Multi-bit Trie 区间DP
标签: 区间dp hdu4570 http://acm.hdu.edu.cn/showproblem.php?pid=4570 题意:这题题意理解变态的.转自大神博客: 这题题意确实有点难懂,起码对于 ...
- minihttp安装配置ssl和c语言实现cgi
概述:参考了大牛们的方法,结合自己的环境做了修改,主要是讲:minihttp安装配置ssl和c语言实现cgi接收字符串并且保存系统环境:centos6.5 开发版 依赖软件包: mini_httpd- ...
- 将Opencv java中的Mat通过jni传递到C++中的方法
public native void FindFeatures(long matAddrGr, long matAddrRgba); ... mRgba = new Mat(height, width ...