MD5填坑备忘

在项目中,使用了很早的用来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

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment