.NetCoreでMyrmecを使用してファイルの実際のフォーマットを検出

5291 ワード

Myrmecって何?
Myrmecはファイルフォーマットを検出するためのライブラリであり、Myrmecは他のライブラリや手書き検出コードとは異なり、Myrmecはファイル拡張子に依存せず(実際の使用では、ユーザーが虚偽の拡張子を使ってアプリケーションを騙す可能性が高い)、Myrmecはファイルのバイナリヘッダを検出し、そのメタデータベースで一致してファイルのフォーマットを取得します.
例えばJpgピクチャのバイナリヘッダが「FFD 8 FFDB」である場合、Myrmecはこのファイルヘッダに一致し、「jpg」と「jpeg」の2つの結果を得る.
使用方法
まず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なの?
多くの場合、1つのファイルフォーマットはjpgなどの複数の拡張子に対応します.また、zip、apk、pptxなど、多くのファイルフォーマットがzip achiveなので、zipファイルに一致すると、少なくとも3つの拡張子が得られます.結果が空の場合、結果は一致しません.
 
複数の結果または1つのクエリ
ファイル形式Aのファイルヘッダが「ff,11,22」であり、ファイル形式Bのファイルヘッダが「ff,11,22,33」である場合、一致するファイルヘッダが「ff,11,22,33,44」である場合、最大2つの結果に一致し、それらに含まれる拡張子を返す
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の拡張メソッドに置き換えられます.
 
メタデータソース
メタデータはウィキペディアのリストから
RoadMap
次に行うべきことは、オフセット量のあるファイルフォーマットをサポートすることです.たとえば、
 ff,11,ff開始オフセット10バイト
および 11,ff,??,??,??,11,??,fdというジャンプを含むファイルフォーマット.
しかし、実際には2つは1つの形式であり、次のバージョンでサポートが発表される予定です.
サポート.net standard.現在は.net core 2で、将来.net standardに調整されます
githubアドレス:https://github.com/rocketRobin/myrmec
nugetアドレス:https://www.nuget.org/packages/Myrmec/
皆さんの試用を歓迎して、意見と提案を出します
 
なぜgithub倉庫は英語ですか?
中国語の開発者としてgithub倉庫で中国語を使っていません.このプロジェクトを長く開発し、世界各地の開発者がこのライブラリを使ったり、開発に参加したりすることを望んでいます.そのため、githubでは英語を使っています.