码农知识堂 - 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. }

  • 相关阅读:
    RK3399快速上手 | 03-rockchip rk3399 linux sdk的使用
    蓝桥杯练习题十 - 煤球数目(c++)
    企业管理论文题目怎么写?
    华为云HECS云服务器docker环境下安装nacos
    网络安全中常用浏览器插件、拓展
    MySQL 计算年龄
    rabbitmq
    Java泛型
    js 设置网页标题(兼容微信内置浏览器)
    101-视频与网络应用篇-教程内容
  • 原文地址:https://blog.csdn.net/nightwizard2030/article/details/125496826
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号