首先将文件的md5值在这个网站计算出来http://www.metools.info/other/o21.html
代码依赖rt-thread操作系统的Fal和dfs_posix组件。其他地方使用改一下数据读取部分,

"md5_val_cal.h"
#ifndef _MD5VALCAL_H_
#define _MD5VALCAL_H_#include "string.h"
#include "stdio.h"
#include "stdbool.h"#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))#define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y))))  #define PP(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24)  #define FF(a, b, c, d, x, s, ac) a = b + (RL((a + F(b,c,d) + x + ac),s))
#define GG(a, b, c, d, x, s, ac) a = b + (RL((a + G(b,c,d) + x + ac),s))
#define HH(a, b, c, d, x, s, ac) a = b + (RL((a + H(b,c,d) + x + ac),s))
#define II(a, b, c, d, x, s, ac) a = b + (RL((a + I(b,c,d) + x + ac),s))#endif
"md5_val_cal.c"
#include "md5_val_cal.h"
#include <rtthread.h>
#include <dfs_posix.h>
#include <fal.h>#define DBG_TAG      "md5_val_cal"
#define DBG_LVL       DBG_LOG#include <rtdbg.h>static unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476,a,b,c,d,flen[2],x[16]; static unsigned char readDataBuf[1024];//定义暂时存储1K外部flash内bin文件static unsigned int readTimes = 0;
static unsigned int dataIndex = 0;   //bin文件字符索引,固件bin文件大小不要超过65Kvoid md5_cal(void){                 //MD5主要计算a=A,b=B,c=C,d=D;FF (a, b, c, d, x[ 0],  7, 0xd76aa478); FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); FF (c, d, a, b, x[ 2], 17, 0x242070db); FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); FF (a, b, c, d, x[ 4],  7, 0xf57c0faf); FF (d, a, b, c, x[ 5], 12, 0x4787c62a); FF (c, d, a, b, x[ 6], 17, 0xa8304613); FF (b, c, d, a, x[ 7], 22, 0xfd469501); FF (a, b, c, d, x[ 8],  7, 0x698098d8); FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); FF (c, d, a, b, x[10], 17, 0xffff5bb1); FF (b, c, d, a, x[11], 22, 0x895cd7be); FF (a, b, c, d, x[12],  7, 0x6b901122); FF (d, a, b, c, x[13], 12, 0xfd987193); FF (c, d, a, b, x[14], 17, 0xa679438e); FF (b, c, d, a, x[15], 22, 0x49b40821); GG (a, b, c, d, x[ 1],  5, 0xf61e2562); GG (d, a, b, c, x[ 6],  9, 0xc040b340); GG (c, d, a, b, x[11], 14, 0x265e5a51); GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); GG (a, b, c, d, x[ 5],  5, 0xd62f105d); GG (d, a, b, c, x[10],  9, 0x02441453); GG (c, d, a, b, x[15], 14, 0xd8a1e681); GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); GG (a, b, c, d, x[ 9],  5, 0x21e1cde6); GG (d, a, b, c, x[14],  9, 0xc33707d6); GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); GG (b, c, d, a, x[ 8], 20, 0x455a14ed); GG (a, b, c, d, x[13],  5, 0xa9e3e905); GG (d, a, b, c, x[ 2],  9, 0xfcefa3f8); GG (c, d, a, b, x[ 7], 14, 0x676f02d9); GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); HH (a, b, c, d, x[ 5],  4, 0xfffa3942); HH (d, a, b, c, x[ 8], 11, 0x8771f681); HH (c, d, a, b, x[11], 16, 0x6d9d6122); HH (b, c, d, a, x[14], 23, 0xfde5380c); HH (a, b, c, d, x[ 1],  4, 0xa4beea44); HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); HH (b, c, d, a, x[10], 23, 0xbebfbc70); HH (a, b, c, d, x[13],  4, 0x289b7ec6); HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); HH (b, c, d, a, x[ 6], 23, 0x04881d05); HH (a, b, c, d, x[ 9],  4, 0xd9d4d039); HH (d, a, b, c, x[12], 11, 0xe6db99e5); HH (c, d, a, b, x[15], 16, 0x1fa27cf8); HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); II (a, b, c, d, x[ 0],  6, 0xf4292244); II (d, a, b, c, x[ 7], 10, 0x432aff97); II (c, d, a, b, x[14], 15, 0xab9423a7); II (b, c, d, a, x[ 5], 21, 0xfc93a039); II (a, b, c, d, x[12],  6, 0x655b59c3); II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); II (c, d, a, b, x[10], 15, 0xffeff47d); II (b, c, d, a, x[ 1], 21, 0x85845dd1); II (a, b, c, d, x[ 8],  6, 0x6fa87e4f); II (d, a, b, c, x[15], 10, 0xfe2ce6e0); II (c, d, a, b, x[ 6], 15, 0xa3014314); II (b, c, d, a, x[13], 21, 0x4e0811a1); II (a, b, c, d, x[ 4],  6, 0xf7537e82); II (d, a, b, c, x[11], 10, 0xbd3af235); II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); II (b, c, d, a, x[ 9], 21, 0xeb86d391); A += a;B += b;C += c;D += d;}static void md5_data_reset()
{readTimes = 0;dataIndex = 0;A=0x67452301;B=0xefcdab89;C=0x98badcfe;D=0x10325476;a=0;b=0;c=0;d=0;memset(flen,0x00,sizeof(flen));memset(x,0x00,sizeof(x));
}void md5_data_deal(unsigned long fileSize)
{unsigned short j = 0;unsigned short k = 0;   unsigned int sampleIndex = 0; //从TEST_data采集64位个字节memset(x,0,64);  sampleIndex = 0;for(j = 0;j < 16;j++)//fread(&x,4,16,fp) 以4字节为一组,共16组往x写入数据{for(k = 0;k < 4;k++){if((readTimes >= fileSize/1024)&&(dataIndex >= fileSize%1024)) break;//当对最后一部分小于1K的bin文件处理((char*)x)[sampleIndex] = readDataBuf[dataIndex];dataIndex++;sampleIndex++;}}
}bool get_flash_md5(char *partitionName,unsigned long size,char *result)
{unsigned short i = 0;const struct fal_flash_dev *flashDev = RT_NULL;const struct fal_partition *partition = RT_NULL;    md5_data_reset();if(!partitionName){LOG_E("bin is null!");return false;}  partition = fal_partition_find(partitionName);if (partition == RT_NULL){rt_kprintf("find partition (%s) failed!\n", RT_NULL);return false;}flashDev = fal_flash_device_find(partition->flash_name);if (flashDev == RT_NULL){rt_kprintf("find flash device (%s) failed!\n", partition->flash_name);return false;}unsigned int readAddr = 0;for(readTimes = 0;readTimes < size/1024;readTimes++)//对整K进行md5_cal计算{fal_partition_read(partition,readAddr,readDataBuf,1024);readAddr += 1024;for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5_cal计算 {md5_data_deal(size);md5_cal();  }dataIndex=0;}memset(readDataBuf,0,1025);fal_partition_read(partition,readAddr,readDataBuf,size%1024);md5_data_deal(size);for(i = 0;i < (size%1024)/64;i++){md5_cal();md5_data_deal(size);}((char*)x)[size%64]=128;//文件结束补1,0操作 10000000flen[1]=size/0x20000000;   //转换二进制文件大小(byte->bit)flen[0]=(size%0x20000000)*8;if(size%64>55) md5_cal(),memset(x,0,64);memcpy(x+14,flen,8);md5_cal();sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));return true;
}bool get_file_md5(char *fileName,char *result)
{unsigned short i = 0;int fd;struct stat fileStat;md5_data_reset();if(!fileName){LOG_E("file is null!");return false;}fd = open(fileName,O_RDONLY);if(fd<0){LOG_E("file open failed!");return false;}if(stat(fileName,&fileStat) <0){LOG_E("get file size failed!");return false;}unsigned int fileSize = fileStat.st_size;for(readTimes = 0;readTimes < fileSize/1024;readTimes++)//对整K进行md5_cal计算{   read(fd,readDataBuf,1024);for(i = 0;i < 16;i++)//刚好对读出的1Kbin文件进行md5_cal计算 {md5_data_deal(fileSize);md5_cal(); }dataIndex=0;}memset(readDataBuf,0,1024);read(fd,readDataBuf,fileSize%1024);   md5_data_deal(fileSize);for(i = 0;i < (fileSize%1024)/64;i++){md5_cal();md5_data_deal(fileSize);}((char*)x)[fileSize%64]=128;//文件结束补1,0操作 10000000flen[1]=fileSize/0x20000000;   //转换二进制文件大小(byte->bit)flen[0]=(fileSize%0x20000000)*8;if(fileSize%64>55) md5_cal(),memset(x,0,64);memcpy(x+14,flen,8);md5_cal();close(fd);sprintf(result,"%08x%08x%08x%08x",PP(A),PP(B),PP(C),PP(D));  return true;
}static void md5_val_cal(int argc,char **argv)
{char md5Val[40];rt_memset(md5Val,0,sizeof(md5Val));if(argc<4){rt_kprintf("input format md5 (file or flash) (name) (size)!\r\n");return;}if(strstr(argv[1],"file") != RT_NULL){if(get_file_md5(argv[2],md5Val)){rt_kprintf("md5 calculate success! md5 val:%s\r\n",md5Val);}else{rt_kprintf("md5 calculate failed!\r\n");}}else if(strstr(argv[1],"flash") != RT_NULL){if(get_flash_md5(argv[2],atol(argv[3]),md5Val)){rt_kprintf("md5 calculate success! md5 val:%s\r\n",md5Val);}else{rt_kprintf("md5 calculate failed!\r\n");}        }
}MSH_CMD_EXPORT_ALIAS(md5_val_cal, md5, cal data md5 val);

STM32计算文件、片上flash、外部flash等数据的MD5校验值相关推荐

  1. STM32计算文件MD5值校验数据

    首先介绍一下什么是MD5: 一.MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值.任意两个文件.字符串不会有相同的散列值(即"很大可能" ...

  2. STM32 IAP升级--内部FLASH和外部FLASH两种方式实现

    芯片型号STM32F103RET6,flash大小512K,起始地址0x08000000 一般说STM32内部FLASH就是指主存储器区域 [注]此实验中启动方式设置为复位后从主闪存存储器启动(BOO ...

  3. CC2640之OAD固件升级实操(使用外部Flash)

    CC2640之OAD固件升级(外置Flash) 转至zzfenglin的博客. 实验环境 1.软件: 协议栈版本:BLE-STACK SDK V2.2 Python版本:Python 2.7.x (v ...

  4. 不用工具,如何快速计算文件的MD5?

    网络安全现在是信息化系统中的必备要素.大家在各种软件下载站上下载的文件,到底有没有被植入木马,是否安全,你心里有底吗?植入木马的一种常用手段,就是黑客先拿下软件下载站点,甚至自己搭建一个站点,然后等你 ...

  5. js文件分片上传,断点续传

    前言 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上 ...

  6. 阿里巴巴计算平台资深技术专家“一浪”对大数据领域近几年的技术趋势和变化的看法【强烈推荐数据岗细细品!】

    导读:计算和存储分离是近几年大数据架构领域颇受关注的一个技术风向.在对刚刚过去的 2019 天猫双 11 技术进行总结时,阿里巴巴 CTO 行癫也特别提到了阿里在计算存储分离上的进展.大数据最初兴起之 ...

  7. 生成文件md5校验码可满足大于2G情况

    对于文件生成md5校验码,在实际开发中用处很大,有利于比较服务器上是否已经存在该文件,哪怕文件名不一致也无所谓. 由于存在超大文件,经过从网上查找,得到两种方法,一种是利用MappedByteBuff ...

  8. linux 目录md5校验,【我的Linux,我做主!】浅谈MD5校验文件完整一致性

    目录: (一)MD5介绍 (二)md5sum命令 (三)实战演练 (一)MD5介绍 (1.1)MD5即Message-Digest Algorithm 5(信息-摘要算法 第5版),用于确保信息传输完 ...

  9. H750移植rt_thread操作系统完整工程分享,包括外部FLASH分散加载文件

    一.移植注意事项 1.在运行外部FLASH存储的代码之前首先要初始化QSPI进入内存映射模式,参考代码: //QSPI进入内存映射模式(执行QSPI代码必备前提,为了减少引入的文件, //除了GPIO ...

最新文章

  1. spring日志报错提醒_Spring Boot 2.x : 整合日志框架 Log4j2
  2. python3语法错误python_[大数据]Python 3.x中使用print函数出现语法错误(SyntaxError: invalid syntax)的原因 - 码姐姐找文...
  3. 微型计算机广告牌实验报告,微型计算机实验报告1资料.doc
  4. unity3d学习笔记(一)-在一个GameObject上进行多个AudioSource的控制
  5. java控制面板作用_Java
  6. 使用Eclipse创建maven项目
  7. Android 应用资源及R文件的位置
  8. UVa 10986 - Sending email
  9. Android之进程间通信AIDL
  10. fill()和fill()_n函数还有memset()函数的比较
  11. 阿里巴巴“牛逼”了,申请“行政干预”区块链专利
  12. ###【Python版本】股票行情API:获取A股主流指数成分股st股和次新股日内资金净流入A股个股实时盘口/历史行情数据基本财务数据/现金流量数据央行货币供应数据融资融券历史数据的Api
  13. 【Linux云计算架构:第二阶段-Linux必会的20多种服务】第22章——-源码编译安装LAMP
  14. MenuetOS, FreeDOS 有了新的发行
  15. GB:香港城市大学孙燕妮组发表高准确度病毒株识别工具VirStrain
  16. 荷塘趣事计算机作业,【《荷塘趣事》摄影图片】生态摄影_人称开哥_太平洋电脑网摄影部落...
  17. 程序猿生存指南-53 春日凉亭
  18. android studio评论功能,Android Studio 使用技巧
  19. 计算机软件著作权的注册和认证
  20. 混合波束成形| 论文:基于MMSE准则的混合波束成形算法

热门文章

  1. 智慧校园什么样?西北民大告诉你
  2. 微盟与汇付天下的阳谋
  3. IEC60086–4:2019原电池第4部分:锂电池的安全性检测
  4. magento eav model study
  5. 在没有wifi,没有路由器,没有网线的情况下,如何让笔记本、电脑等设备联网 解决手机热点网络慢的问题
  6. 移动端发票识别SDK
  7. 计算机软件著作评职称有用吗,软件著作权评职称有用吗
  8. 十步学习 Redis 分布式锁
  9. IDEA最好用的插件推荐,吐血整理!
  10. 【附源码】Java计算机毕业设计安卓基于移动群智感知城市轨道交通激励APP(程序+LW+部署)