在.NetCore中使用Myrmec檢測文件真實格式

Myrmec 是什麼?

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)

爲何結果是List<String>?

許多時候一個文件格式會對應多個擴展名,好比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個擴展名。開發

獲取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上使用的是英文。

相關文章
相關標籤/搜索