cocos2d-x CCUserDefault的加密

cocos2d-x CCUserDefault的加密,第1张

概述cocos2dx的源代码中已经添加了base64的算法,就在base文件夹下,有base64.h和base64.cpp 但是代码有一点问题,需要先修改一下: 在int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned char *output, unsigned int *output_len )函

cocos2dx的源代码中已经添加了base64的算法,就在base文件夹下,有base64.h和base64.cpp

但是代码有一点问题,需要先修改一下:

在int _base64Decode(const unsigned char *input,unsigned int input_len,unsigned char *output,unsigned int *output_len )函数中return之前加上这么一句:

output[output_IDx] = '
static voID setValueForKey(const char* pKey,const char* pValue){	char* pEncodeValue = 0;	base64Encode((const unsigned char*)pValue,strlen(pValue),&pEncodeValue);    tinyxml2::XMLElement* rootNode;    tinyxml2::XMLdocument* doc;    tinyxml2::XMLElement* node;    // check the params    if (! pKey || ! pValue)    {        return;    }    // find the node	node = getXMLNodeForKey(pKey,&rootNode,&doc);    // if node exist,change the content    if (node)    {        if (node->FirstChild())        {			node->FirstChild()->SetValue(pEncodeValue);        }        else        {			tinyxml2::XMLText* content = doc->NewText(pEncodeValue);            node->linkEndChild(content);        }    }    else    {        if (rootNode)        {			tinyxml2::XMLElement* tmpNode = doc->NewElement(pKey);//new tinyxml2::XMLElement(pKey);            rootNode->linkEndChild(tmpNode);			tinyxml2::XMLText* content = doc->NewText(pEncodeValue);//new tinyxml2::XMLText(pValue);            tmpNode->linkEndChild(content);        }        }    // save file and free doc    if (doc)    {        doc->Savefile(fileUtils::getInstance()->getSuitableFOpen(UserDefault::getInstance()->getXMLfilePath()).c_str());        delete doc;    }}
';

我也是不太懂为什么官方自带的char* *** 作函数里连个结束符都不加= =


然后修改CCUserDefault.cpp中的函数

首先所有的set系列函数最终都调用了setValueForKey,所以加密只用修改这个函数就可以了:

bool UserDefault::getBoolForKey(const char* pKey,bool defaultValue){    const char* value = nullptr;    tinyxml2::XMLElement* rootNode;    tinyxml2::XMLdocument* doc;    tinyxml2::XMLElement* node;	node = getXMLNodeForKey(pKey,&doc);	    // find the node    if (node && node->FirstChild())    {        value = (const char*)(node->FirstChild()->Value());    }    bool ret = defaultValue;    if (value)    {		unsigned char* pDecodeValue = 0;		base64Decode((const unsigned char*)value,strlen(value),&pDecodeValue);        ret = (! strcmp((const char*)pDecodeValue,"true"));    }    if (doc) delete doc;    return ret;}

这里只加密了pValue,pKey不加密是因为经过base加密后的字符串结尾都会有'=',但xml中标签里等号是特殊字符,所以直接加密pKey会导致xml文件的损坏。

一个解决方法是在代码中把所有的key映射成另外的名字,比如全部映射成"Data01"、"Data02"……这样


其次是解密,由于get系列函数并没有调用一个共同的getValue函数,所以需要修改所有的get函数,但修改内容是一样的,所以只示范一个:


这样,CCUserDefault的简单加密解密就完成了,重新编译工程,测试你的代码,就可以看到UserDefault.xml文件中已经存储了加密信息,同时读取也不会有什么问题。


最后是一点吐槽,UserDefault顾名思义应该是存储一些用户设置之类的数据,大概是因为这样所以官方尽管引入了base64算法却没有给它加上,我真的很想知道为什么cocos2dx没有专门的管理游戏存档的类= =

总结

以上是内存溢出为你收集整理的cocos2d-x CCUserDefault的加密全部内容,希望文章能够帮你解决cocos2d-x CCUserDefault的加密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存