zoukankan      html  css  js  c++  java
  • 在.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上使用的是英文。

  • 相关阅读:
    jQuery Lazy Load 图片延迟加载
    jquery多级联动(ajax查数据库)
    在命令行快速切换目录(转载)
    推荐Mac软件Alfred
    Vim的snipMate插件
    腾讯CMEM的PHP扩展(转载)
    svn hooks使用
    samba基本配置
    linux进程状态详解(转)
    elk systemd管理
  • 原文地址:https://www.cnblogs.com/rocketRobin/p/8446273.html
Copyright © 2011-2022 走看看