码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 文件真实类型识别 - linux c file


    在windows下,文件类型一般以后缀名的形式体现,但后缀名却是可以随意更改的。甚至在linux下,本身是没有后缀名的概念的。在很多应用中,需要判断文件的真实类型,例如web上传文件等

    在网上有很多都是简单识别下文件特征,例如jpg、png、mp4这些常见的格式,那么有没有很全面的文件类型识别的方法呢?当然是有的

    当时调研了很多库,发现linux下开源的file所覆盖的范围当属第一,纯c代码,通过阅读源码可以知道,既可以通过magic文件拓展识别特征,还能对文本判断编码、是CR、LF还是CRLF之类的,可谓是面面俱到。

    那么使用起来如何?有两种方法,一种是直接用shell调file,直接把文件路径传进去,管道获取返回结果,这种看起来就很low,如果是频繁调用的话,性能也是存在很大问题的,所以还是需要直接使用libmagic.so的接口,需在GitHub上把最新的file拉下来编译make install,然后参考file的源码可以抠出使用方法

    使用方法很简单:

    1、根据需求,设置flags为

            a、MAGIC_EXTENSION,用于获取文件真实后缀,由于目前magic里面的后缀不是很全,还需要自行补充很多 !ext:xxx

            b、MAGIC_MIME_ENCODING|MAGIC_MIME_TYPE,用于获取文件MIME类型以及文本编码,看了下现有的magic文件,MIME是非常全的,推荐使用这种方法做类型判断

    2、调用load,指定magicfile路径,传入flags

    3、创建个128K的Buffer(根据多种类型实验,自己推断出的一个大致比较准确高效的值),将文件读取出来放在Buffer上

    4、调用magic_buffer 返回即为需要的数据

    GitHub - file/file: Read-only mirror of file CVS repository, updated every half hour. NOTE: do not make pull requests here, nor comment any commits, submit them usual way to bug tracker or to the mailing list. Maintainer(s) are not tracking this git mirror.Read-only mirror of file CVS repository, updated every half hour. NOTE: do not make pull requests here, nor comment any commits, submit them usual way to bug tracker or to the mailing list. Maintainer(s) are not tracking this git mirror. - GitHub - file/file: Read-only mirror of file CVS repository, updated every half hour. NOTE: do not make pull requests here, nor comment any commits, submit them usual way to bug tracker or to the mailing list. Maintainer(s) are not tracking this git mirror.https://github.com/file/file

    1. #include<magic.h>
    2. void test(){
    3. int flags=0;
    4. struct magic_set* g_magic=load(magic_file_path,flags);
    5. const char* ret=magic_buffer(g_magic,buf,len);
    6. }

  • 相关阅读:
    C++11中原子变量std::atomic使用小记
    云南白药Java后端面经
    AWK用法全解与sed去掉sql最后一个字段哪一行的逗号
    java多线程深度修炼
    观察级水下机器人使用系列之七机械手臂
    面向对象编程原则(06)——依赖倒转原则
    代码随想录二叉树——对称二叉树
    jsp中使用PDF.js实现pdf文件的预览
    处理uniapp打包后有广告的问题
    labview 混合信号图 多曲线分组
  • 原文地址:https://blog.csdn.net/nightwizard2030/article/details/125496826
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号