参考博客:https://blog.csdn.net/osmeteor/article/details/40299357
根据图片格式校验图片的完整性。支持png,bmp,jpg,gif
字节缓冲区管理,防止内存泄露

class CByteBuffer
{public:CByteBuffer(size_t len){m_length = len;m_byte = new byte[m_length];memset(m_byte, 0, m_length);}~CByteBuffer(){if (m_byte){delete[]m_byte;m_byte = nullptr;}}byte* data(){ return m_byte; }byte operator[](size_t index){ return m_byte[index]; }size_t length(){ return m_length; }
private:size_t m_length;byte *m_byte;
};

涉及函数:int to hex

std::string toHex(int num)
{if (num == 0)return "0";std::string res = "";std::string hex[16] = { "0", "1", "2", "3", "4", "5", "6", "7","8", "9", "a", "b", "c", "d", "e", "f" };unsigned int num2 = num;//无论正负,全部转换成无符号整型while (num2){res = hex[num2 % 16] + res;//取余即是最低位num2 /= 16;}return res;
}

校验文件完整性

bool IsCompletedImage(std::string strFileName)
{struct _stat info;_stat(strFileName.c_str(), &info);FILE *fp = fopen(strFileName.c_str(), "r+b");if (fp == nullptr){return false;}CByteBuffer buffer(info.st_size);size_t iread = fread(buffer.data(), 1, buffer.length(), fp);if (iread != buffer.length()){return false;}//jpg png图是根据最前面和最后面特殊字节确定. bmp根据文件长度确定//png检查if (buffer[0] == 137 && buffer[1] == 80 && buffer[2] == 78 && buffer[3] == 71 && buffer[4] == 13&& buffer[5] == 10 && buffer[6] == 26 && buffer[7] == 10){if (buffer[buffer.length() - 5] == 68 && buffer[buffer.length() - 4] == 174 && buffer[buffer.length() - 3] == 66&& buffer[buffer.length() - 2] == 96 && buffer[buffer.length() - 1] == 130)return true;//有些情况最后多了些没用的字节for (int i = buffer.length() - 1; i > buffer.length() / 2; --i){if (buffer[i - 5] == 68 && buffer[i - 4] == 174 && buffer[i - 3] == 66&& buffer[i - 2] == 96 && buffer[i - 1] == 130)return true;}}else if (buffer[0] == 66 && buffer[1] == 77)//bmp{//bmp长度//整数转成字符串拼接std::string str = toHex(buffer[5]) + toHex(buffer[4])+ toHex(buffer[3]) + toHex(buffer[2]);std::stringstream ss;ss << std::hex << str;int iLength = 0; //16进制数转成整数ss >> iLength;if (iLength <= buffer.length()) //有些图比实际要长return true;}else if (buffer[0] == 71 && buffer[1] == 73 && buffer[2] == 70 && buffer[3] == 56)//gif{//标准gif 检查00 3Bif (buffer[buffer.length() - 2] == 0 && buffer[buffer.length() - 1] == 59)return true;//检查含00 3Bfor (int i = buffer.length() - 1; i > buffer.length() / 2; --i){if (buffer[i] != 0){if (buffer[i] == 59 && buffer[i - 1] == 0)return true;}}}else if (buffer[0] == 255 && buffer[1] == 216) //jpg{//标准jpeg最后出现ff d9if (buffer[buffer.length() - 2] == 255 && buffer[buffer.length() - 1] == 217)return true;else{//有好多jpg最后被人为补了些字符也能打得开, 算作完整jpg, ffd9出现在近末端//jpeg开始几个是特殊字节, 所以最后大于10就行了 从最后字符遍历//有些文件会出现两个ffd9 后半部分ffd9才行for (int i = buffer.length() - 2; i > buffer.length() / 2; --i){//检查有没有ffd9连在一起的if (buffer[i] == 255 && buffer[i + 1] == 217)return true;}}}return false;
}

C++ 图片完整性校验相关推荐

  1. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致...

    git clone https://github.com/iagox86/nbtool make 然后就可以按照下面的官方说明进行操作了. 我的感受:整体感觉这个工具不完善,失败率很高,传文件时候没有 ...

  2. dex、apk完整性校验

    对Dex进行完整性的检查,可通过CRC,或者Hash值.可将校验值放到String资源文件里,或者放到服务器中. 在代码中完成校验值对比逻辑,此部分代码后续不能再改变,否则CRC值会发生变化: 从生成 ...

  3. 解决ImageLoader加载HTTPS图片证书校验异常问题

    解决ImageLoader加载HTTPS图片证书校验异常问题 参考文章: (1)解决ImageLoader加载HTTPS图片证书校验异常问题 (2)https://www.cnblogs.com/cs ...

  4. Week 3: 边下边播完整性校验作业

    文章目录 边下边播完整性校验 解题思路 样例程序 代码 结果 边下边播完整性校验 week 3最后的编程作业是解决体积较大的视频文件边下边播完整性校验问题, 原题如下: Suppose a web s ...

  5. Java 文件完整性校验 MD5 sha1 sha256 sha224 sha384 sha512

    由于项目中需要使用文件做备份,并且要提供备份文件的下载功能.备份文件体积较大,为确保下载后的文件与原文件一致,需要提供文件完整性校验. 网上有这么多此类文章,其中不少使用到了 org.apache.c ...

  6. Android APP安全之APK完整性校验

    一.认识APK安全性 危害 可以通过修改客户端文件篡改客户端行为.攻击者可以让客户端显示自己制作的钓鱼网站,偷取用户信息 二.完整性校验原理 完整性校验的几种方式 CRC校验 MD5值校验 SHA1值 ...

  7. 下载的图片损坏 图片完整性检测工具

    下载的图片损坏 图片完整性检测工具 下载的文件大约有千分之几的概率损坏, 以图片为例: import lib_sha256 import io import imghdr from os import ...

  8. 文件完整性校验码计算工具

    文件完整性校验码计算工具 工具介绍 支持算法:CRC32,MD2,MD4,MD5,SHA1,SHA256,SHA512,RipeMD128,RIPEMD160,ED2K 多个哈希类型可以同时生成每个文 ...

  9. Java 文件完整性校验 sha512

    由于项目中需要使用文件做备份,并且要提供备份文件的下载功能.备份文件体积较大,为确保下载后的文件与原文件一致,需要提供文件完整性校验. 网上有这么多此类文章,其中不少使用到了 org.apache.c ...

最新文章

  1. Entity Framework快速入门笔记第四篇—ModelFirst
  2. Spring MVC注解故障追踪记
  3. Nginx HTTP之请求行解析函数ngx_http_parse_request_line
  4. docker 进入容器命令_Docker容器常用命令分享,赶紧收藏
  5. 华为高性能服务器刀箱,云平台服务器刀箱
  6. js获取元素的方法与属性
  7. 【opencv学习】单应性变换Homography
  8. Arrays工具类和二维数组
  9. 浅谈代码审计入门实战:某博客系统最新版审计之旅
  10. 清华山维eps软件_这几款倾斜实景三维裸眼3D采集软件你了解吗?
  11. 云计算基础(纯理论)
  12. 易班自动答题脚本_一款功能强大的答题小程序,更智能的在线考试系统,出好试卷,随机出题的微信小程序...
  13. Word转PDF免费的网站——speedpdf在线免费转换器
  14. ddr2之OCD、ODT和Post CAS技术
  15. Jetson_nano环境配置
  16. 对bam文件作基础统计
  17. 小步快跑是这样玩的(下)
  18. 知乎带货月入过万的赚钱路子,前期操作后期可躺赚
  19. Web开发了一个完整精美的聊天室(登录部分引入了Vue技术)
  20. logout命令详解

热门文章

  1. ld-linux-x86-64.so.2+,RedHat6安装Oracle数据库遇到错误C[ld-linux-x86-64.so.2+0x14d70]
  2. 什么样的人可以担任项目经理?
  3. 重庆天象网络技术:三分构图法帮你做好版式设计
  4. 004:AWS数据湖解决方案
  5. The meaning of path integral formulation
  6. 凹凸世界搬运工机器人图片_【图片】【原创】凹凸世界后续剧情_凹凸世界吧_百度贴吧...
  7. 长沙理工大学第十二届ACM大赛-重现赛 L - 选择困难症
  8. 普京签署法案禁止美公民收养俄儿童
  9. Win10 UWP应用发布流程
  10. Excel中对中文字符,英文字符,数字,单独染色