在项目中,使用了很早的用来MD5的c++文件,结果就是只能用在32位的机器上,而现在苹果提审必须要适配64位,所以就造成了很尴尬的情况。
好在是只有苹果限制,所以专为苹果做了一个条件,苹果的话走oc的方法。
std::string DeviceModule::getIOSMD5(const char *strValue,unsigned long size) { std::string ret; unsigned char result[16]; CC_MD5(strValue, size, result); // This is the md5 call NSString *str =[NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; ret = [str UTF8String]; return ret; }
这个之前有个坑是在传字段的时候,之前是为了方便传的string字段,然而工程中,文件的返回值却是unsigned char*字段,坑就会出现在结尾的'\0'的那里,一定要注意,最后搜到了几个unsigned char*转为string的好方法,类似于这样转换
#include <iostream> #include <string> #include <algorithm> #include <iterator> #include <sstream> using namespace std; int main(int argc, char** argv) { unsigned char uc[3] = {0x31,0x32,0x33}; char *pch; size_t len = sizeof(uc) / sizeof(uc[0]); string str1 (reinterpret_cast<const char*>(uc),len); //方法1 string str2; string str3; //方法2 pch = new char[len+1]; memcpy(pch, uc, len); pch[len] = '\0'; str2 = pch; delete pch; //方法3 stringstream ss; copy(uc, uc+len, ostream_iterator<char>(ss)); string str3 = ss.str(); //输出 cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; return 0; }
当然也可以直接强制类型转换str = (char*)uc这种的
然后就是另外的一个地方,因为有的是在后面使用那个c++的MD5Update方法增加md5的字段,比如这样
unsigned char pMD5Result[16]; MD5_CTX tMD5CTX; tMD5CTX.MD5Update((unsigned char*)"jiEakgAMe", 9); tMD5CTX.MD5Update((unsigned char*)strRootVal.c_str(), strRootVal.size()); tMD5CTX.MD5Final(pMD5Result); sprintf(pBuf,"%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", pMD5Result[0],pMD5Result[1],pMD5Result[2],pMD5Result[3], pMD5Result[4],pMD5Result[5],pMD5Result[6],pMD5Result[7], pMD5Result[8],pMD5Result[9],pMD5Result[10],pMD5Result[11], pMD5Result[12],pMD5Result[13],pMD5Result[14],pMD5Result[15] );
这个一般都是这个方法,就是追加MD5内容的字段,但是oc里面是没有的,所以可以这样做
CCString *str = CCString::createWithFormat("jiEakgAMe%s",strRootVal.c_str()); strMD5 = DeviceModule::sharedDeviceModule()->getIOSMD5(str->getCString(), 9+strRootVal.size());
然后就可以生成相同的了。
最后终于脱坑成功,当然,现在一般的库都会增加类似于uint32这样自己定义的类型,用来在64位和32位之间动态转换,为以后避免了麻烦。
这里分享一下那个c++文件,32位下还是很好用的
32位MD5验证文件下载
Github下载:https://github.com/DamonHu/32-md5
Gitosc下载:http://git.oschina.net/DamonHoo/32-md5
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/251.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!