在项目中,使用了很早的用来MD5的c++文件,结果就是只能用在32位的机器上,而现在苹果提审必须要适配64位,所以就造成了很尴尬的情况。
好在是只有苹果限制,所以专为苹果做了一个条件,苹果的话走oc的方法。</p><p></p><pre class="prettyprint lang-cpp linenums">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的好方法,类似于这样转换</p><p></p><pre class="prettyprint lang-cpp linenums">#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这种的</p><p>
然后就是另外的一个地方,因为有的是在后面使用那个c++的MD5Update方法增加md5的字段,比如这样</p><p></p><pre class="prettyprint lang-cpp linenums">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里面是没有的,所以可以这样做</p><p></p><pre class="prettyprint linenums">CCString *str = CCString::createWithFormat("jiEakgAMe%s",strRootVal.c_str());
strMD5 = DeviceModule::sharedDeviceModule()->getIOSMD5(str->getCString(), 9+strRootVal.size());
然后就可以生成相同的了。</p><p>
最后终于脱坑成功,当然,现在一般的库都会增加类似于uint32这样自己定义的类型,用来在64位和32位之间动态转换,为以后避免了麻烦。</p><p><br/></p><p>
这里分享一下那个c++文件,32位下还是很好用的</p><h2>32位MD5验证文件下载</h2><p>Github下载:<a href="https://github.com/DamonHu/32-md5" target="_blank">https://github.com/DamonHu/32-md5</a></p><p>Gitosc下载:<a href="http://git.oschina.net/DamonHoo/32-md5" target="_blank">http://git.oschina.net/DamonHoo/32-md5</a></p>
版权属于:胡东东博客
本文链接:http://blog.hudongdong.com/c/251.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!
☟☟如文章有用,可点击一次下方广告支持一下☟☟