博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在.NetCore中使用Myrmec检测文件真实格式
阅读量:7040 次
发布时间:2019-06-28

本文共 1744 字,大约阅读时间需要 5 分钟。

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
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 false3 List
results = sniffer.Match(fileHead,false);4 5 // 这会匹配到所有的结果6 List
results = sniffer.Match(fileHead,true);

添加自定义的文件头

也许你创建了一种文件格式,或者你所使用的文件格式不在元数据中,这时你可以使用下面的代码将其加入元数据:

1 var data = new byte[]2 {3     0x11,4     0x22,5     0x336 };7 sniffer.Add(data, new[] { "what", "file", "type" });

注意这个新添加的格式拥有3个扩展名。

获取MimeType

1 List
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 这种含有跳跃的文件格式。

不过事实上他们两个是一种形式,预计下一个版本就会发布对其的支持。

支持 .net standard.现在是.net core 2,在未来会调整到.net standard

欢迎大家试用,提出意见与建议

 

为什么github仓库是英文的?

作为一个中文开发者,我没有在github仓库中使用中文,因为我希望能够长久的开发这个项目,并希望世界各地的开发者都能使用这个库,或者参与开发,为了此目的,我在github上使用的是英文。

转载地址:http://ozaal.baihongyu.com/

你可能感兴趣的文章
React中的setTimeout、setInterval的注意事项
查看>>
如何深入使用scss开发一个简单页面
查看>>
JS学习系列 03 - 函数作用域和块作用域
查看>>
外卖订单爬虫(美团,饿了么,百度外卖)
查看>>
用Flink取代Spark Streaming,知乎实时数仓架构演进
查看>>
2019年值得关注的八大DevOps趋势
查看>>
教育部下令中小学推广编程教育,全民AI真的要来了
查看>>
C#未来新特性:静态委托和函数指针
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
如何避免移动测试自动化失败
查看>>
Real World Kanban作者访谈
查看>>
Confluent平台5.0支持LDAP授权及用于IoT集成的MQTT代理
查看>>
Promise 源码分析
查看>>
干货 :手把手教你在试验中修正机器学习模型
查看>>
.NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能 ...
查看>>
JDK8新特性之Optional
查看>>
Spark2.4.0源码分析之WorldCount 触发作业提交(二)
查看>>
Python零基础学习笔记(四十)—— datetime和Calendar ...
查看>>
事故现场:MySQL 中一个双引号的错位引发的血案 ...
查看>>
MaxCompute_UDF_开发指南
查看>>