使用OpenSSL库获取文件的md5值。
在开发过程中,会遇到需要OTA升级,文件拷贝等操作。需要判断下载或者拷贝的文件是否成功,需要通过比对文件前后的md5值。
C++:
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
#include <openssl/md5.h>
std::string getMd5FromeFile(std::string filename){
std::ifstream file(filename, std:: ifstream::binary);
if (!file.is_open()) {
return "";
}
MD5_CTX md5Context;
MD5_Init(&md5Context);
Char buf[1024*16];
while(file.good()){
file.read(buf,sizeof(buf));
MD5_Update(&md5Context, buf, file.gcount());
}
unsigned char result[MD5_DIGEST_LENGTH];
MD5_Final(result, & md5Context);
std::stringstream md5string;
md5string << std::hex << std::nouppercase << std::setfill(‘0’);
for(const auto &byte: result)
md5string << std::setw(2) << (int)byte;
return md5string.str();
}
Android java
public static String getFileMD5(File file) {
if (!file.isFile()) {
return null;
}
MessageDigest digest = null;
FileInputStream in = null;
byte buffer[] = new byte[8192];
int len;
try {
digest = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer)) != -1) {
digest.update(buffer, 0, len);
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}