在.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/
歡迎大家試用,提出意見與建議
在.NetCore中使用Myrmec檢測文件真實格式