Myrmec 是一个用于检测文件格式的库,Myrmec不一样于其它库或者手写检测代码,Myrmec不依赖文件扩展名(在实际使用中,你的用户极可能使用虚假的扩展名欺骗你的应用程序),Myrmec会检测文件的二进制头,并在其元数据库中匹配来得到文件的格式。git
例如Jpg图片的二进制头是 "FF D8 FF DB" 那么Myrmec会匹配到这个文件头,并得到两个结果--"jpg"和"jpeg"。github
首先安装 nuget 包数据库
Install-Package Myrmecspa
或者经过 DotnetCli.net
dotnet add package Myrmec code
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)
许多时候一个文件格式会对应多个扩展名,好比jpg。还有的时候多种文件格式都是一种文件格式,好比 zip、apk、pptx 它们都是zip achive ,因此当你匹配了一个zip文件,那么你最少会得到3个扩展名。当结果是空时,说明没有匹配到结果。blog
会有这样的状况:文件格式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);
也许你建立了一种文件格式,或者你所使用的文件格式不在元数据中,这时你可使用下面的代码将其加入元数据:ip
1 var data = new byte[] 2 { 3 0x11, 4 0x22, 5 0x33 6 }; 7 sniffer.Add(data, new[] { "what", "file", "type" });
注意这个新添加的格式拥有3个扩展名。开发
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.
接下来要作的事就是支持 带有偏移量的 文件格式,例如
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上使用的是英文。