linux 下查找图片文件方法
通常是通过文件后缀名查找图片文件,如果没有文件后缀的图片或者伪造的图片文件,则这种判定方法将达不到要求。我们可以根据读取文件头进行图片文件类型的判定。
比较流行的图片文件类型有:jpg png bmp gif 这几种,下面将介绍区分这几种图片的方式:
BMP (bmp) 文件头(2 byte): 0x42,0x4D
JPEG (jpg) 文件头(3 byte): 0xFF,0xD8,0xFF
PNG (png) 文件头(4 byte): 0x89,0x50,0x4E,0x47
GIF (gif) 文件头(4byte): 0x47,0x49,0x46,0x38
应用程序通过可以读取文件头进行匹配。linux 下测试例子:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <dirent.h>
- int main(int argc, const char *argv[])
- {
- int ret = ;
- DIR * dir;
- struct dirent * info;
- // int i=0;
- if(argc != ){
- printf("Usage: %s /path/to/file",argv[]);
- return -;
- }
- dir = opendir(argv[]);
- if(!dir){
- perror("opendir");
- return -;
- }
- while((info = readdir(dir)) != NULL){
- struct stat file_sta;
- ret = stat(info->d_name,&file_sta);
- if(ret < ){
- perror("stat");
- return -;
- }
- if(S_ISREG(file_sta.st_mode)){
- printf("%s \n",info->d_name);
- FILE *fp = fopen(info->d_name,"rb");
- if(!fp){
- perror("fopen");
- continue;
- }
- // 此处的类型定义必须定义为 unsigned 类型 (不然编译器会当做有符号类型处理)
- unsigned char buf[] = {};
- ret = fread(buf,,,fp);
- if((buf[] == 0x42) && (buf[] == 0x4D)){
- printf("file type(bmp) : %s \n",info->d_name);
- }
- else if((buf[] == 0xFF) && (buf[] == 0xD8) && (buf[] == 0xFF)){
- printf("file type(jpg) : %s \n",info->d_name);
- }
- else if((buf[] == 0x89) && (buf[] == 0x50) && (buf[] == 0x4e) && (buf[] == 0x47)){
- printf("file type(png) : %s \n",info->d_name);
- }
- else if((buf[] == 0x47) && (buf[] == 0x49) && (buf[] == 0x46) && (buf[] == 0x38)){
- printf("file type(gif) : %s \n",info->d_name);
- }
- else{
- }
- fclose(fp);
- }
- }
- closedir(dir);
- return ;
- }
运行结果:
linux 下查找图片文件方法的更多相关文章
- Linux下查找大文件以及目录
转自:http://www.cnblogs.com/kerrycode/p/4391859.html 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在 ...
- linux下查找某个文件位置的方法
一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 下,甚至在系统的某个地方也不知道,则这是可以使用如下命令: find / -name httpd.conf ...
- Linux下查找大文件,大目录的方法
查找大文件 //列举出当前目录所有大于800M的文件 find . -type f -size +800M 1 2 第一个方法只用到了一个命令find,它能够帮我们做一些文件查找的操作.它常用的参数有 ...
- linux下查找某个文件
参考http://blog.csdn.net/gray13/article/details/6365654 一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 ...
- Linux下打开超大文件方法
在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -10000 /var/lib/mysq ...
- LINUX下查找大文件及大的文件夹
原帖地址:https://www.cnblogs.com/iyoume2008/p/6105590.html 今天正好碰到这样的问题,在博客园中看到有以上地址的一篇文章,照着上面的操作解决了问题,但是 ...
- Linux下查找最大文件
当我们应用一段时间以后,Linux可能会变得臃肿了,那么,怎么找出一个“path”下的最大文件呢? 可以使用du命令,如: du -sh [dirname|filename] 如:当前目录的大小: d ...
- linux下查找某文件关键字
-e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear
- linux下查找某文件关键字(grep 函数)
-e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear
随机推荐
- 201521123013 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping值 ...
- 201521123011《Java程序设计》 第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- Java、javax、org、sun、Java.util等常用包的区别、详解、实例
Java.javax.org.sun包都是jdk提供的类包,且都是在rt.jar中.rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就 ...
- 06jQuery-05-事件
不同的浏览器绑定事件的代码都不太一样,所以我们使用jQuery来写代码的话,可以屏蔽不同浏览器之间的差异. 在jQuery中,可以使用 on 来绑定一个事件,指定事件的名称和对应的处理函数: // 获 ...
- 《Head First 设计模式》读书笔记(1) - 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- java线程池相关知识点总结
Android中常见到的很多通用组件一般都离不开"池"的概念,如各种图片加载库,网络请求库,即使Android的消息传递机制中的Meaasge当使用Meaasge.obtain() ...
- .NET Core 使用RabbitMQ
RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...
- 非position:fixed,footer自動調到屏幕底部
一.980px手機端寫法: $(function(){ var sh=$('section').height(); var ww=$(window).width(); ...
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...
- js 倒计时(服务器时间同步)
首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...