天天看点

【IOS-COCOS2D-X 游戏开发之六】使用BASE64算法对COCOS2DX自带CCUSERDEFAULT游戏存储数据编码加密!

上一篇介绍了,如何使用cocos2dx自带的ccuserdefault 存储游戏数据,那么himi也提到此方式保存的为xml格式并且数据明文显示=。 =,这个对于我们开发者来说太暴漏了有木有! so~本篇himi分享如何使用经典base64算法对ccuserdefault进行数据编码形成一种简单的加密形式!

ok,关于base64的介绍,himi不再赘述,还不太熟悉的童鞋请点击以下连接阅读:

如果对于cocos2dx自带的ccuserdefault类不太熟悉的请点击如下连接:

<a href="http://www.himigame.com/iphone-cocos2dx/653.html" target="_blank">【ios-cocos2d-x 游戏开发之五】游戏存储之cocos2dx自带ccuserdefault类详解;</a>

对base64有了基础认识后我们就开始进入正题,首先,我们针对cocos2dx使用c++版的base64编码文件:

base64.h以及base64.cpp  文件下载导入项目中:[download id=”63″]

然后himi封装好了两个函数:(这里我们假设存储游戏金币)

首先.h中,定义枚举变量(备注1)

1

2

3

4

enum{

    data_gold,//金币

};

然后.h定义两个函数:(备注2)

5

    //存储数据

    void savedatabykeyvalue(int ikey, string svalue);

    //读取数据

    int loaddatabykey(int ikey);

最后.cpp中函数具体实现代码:(备注3)

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//存储

void helloworld::savedatabykeyvalue(int ikey, string svalue){

    char buffer[32];

    sprintf(buffer, "%s%d", "himi",ikey);

    cclog("----------存储");

    cclog("存储之前数据 key:index: himi%i, value: %s  ",ikey,svalue.c_str());

    string skey = himisavedata(reinterpret_cast&amp;lt;const unsigned char*&amp;gt;(svalue.c_str()), svalue.length());

    cclog("存储编码后的数据 key:index: himi%i, value: %s  ",ikey,skey.c_str());

    ccuserdefault::shareduserdefault()-&amp;gt;setstringforkey(buffer, skey);

    ccuserdefault::shareduserdefault()-&amp;gt;flush();

}

//读取

int helloworld::loaddatabykey(int ikey){

    cclog("----------读取");

    string s = ccuserdefault::shareduserdefault()-&amp;gt;getstringforkey(buffer);

    cclog("解码前的数据: %s  ",s.c_str());

    string parsekey = himiparsedata(s);

    cclog("解码后的数据: %s  ",parsekey.c_str());

    return atoi(parsekey.c_str());

ok,这里开始逐步解释一下:

首先说下备注2,这里定义的两个方法,第一个函数:

//存储数据

其中第一个函数传入一个int值,为什么要这样,原因是这样方便与结合枚举变量(备注1)来进行存储,这样使用的时候非常简化你的代码和步骤;第二个函数是值,这里我封装成string,这样为了更好的结合我们的base64编码!这点在(备注3)中体现!

第二个函数:

//读取数据

这个函数没什么好说的,传入的参数int,枚举变量即可!至于返回值是int 是方便程序中使用!

ok,那么备注3对于两个封装函数中的实现需要说明的有3点:

1.  将传入的int值(key)转化成char*类型,因为cocos2dx中并没有itoa这样的方法(原因上一篇有介绍),所以这里我采用   char buffer[32];    sprintf(buffer, “%s%d”, “himi”,ikey);  方式进行将int转化char*类型;

2. 存储的时候我们步骤是:string值进行base64编码,然后存储到xml中;

3. 将int转化string的时候我在枚举变量前加入”himi”,大家不喜欢可以换成自己喜欢的,但是千万不要删除!因为一旦你删除掉,然后将存储后的形式为: &lt;1&gt;数据&lt;/1&gt;  这样会造成你读取数据出错!

读取数据步骤:根据key读取xml的编码过的string,然后base64解码出原始值,最终atoi转化成int扔出!

这其中应该说没什么难于理解的,所以这里不再赘述了;

那么下面我们来看这两个函数如何使用:

    //base64编码存储

    this-&amp;gt;savedatabykeyvalue(data_gold, "10000");

    //base64读取数据

    this-&amp;gt;loaddatabykey(data_gold);

代码是不是用起来很方面呢!哈哈,这就对啦,不能因为编码弄得乱78糟~ok,运行项目,控制台你将看到如下显示:

cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0

cocos2d: cocos2d: gl_vendor:     imagination technologies

cocos2d: cocos2d: gl_renderer:   powervr sgx 543

cocos2d: cocos2d: gl_version:    opengl es-cm 1.1 imgsgx543-63.14.2

cocos2d: cocos2d: gl_max_texture_size: 4096

cocos2d: cocos2d: gl_max_modelview_stack_depth: 16

cocos2d: cocos2d: gl supports pvrtc: yes

cocos2d: cocos2d: gl supports bgra8888 textures: no

cocos2d: cocos2d: gl supports npot textures: yes

cocos2d: cocos2d: gl supports discard_framebuffer: yes

cocos2d: cocos2d: compiled with npot support: no

cocos2d: cocos2d: compiled with vbo support in textureatlas : no

cocos2d: 此项目已存在保存数据的xml文件

cocos2d: 存储之前数据 key:index: 0, value: 10000

cocos2d: 存储编码后的数据 key:index: 0, value: mtawmda=

cocos2d: 解码前的数据: mtawmda=

cocos2d: 解码后的数据: 10000

存储的文件内容截图如下:

【IOS-COCOS2D-X 游戏开发之六】使用BASE64算法对COCOS2DX自带CCUSERDEFAULT游戏存储数据编码加密!

ok,最后呢,我要说一点,虽然我们使用base64可以对数据进行编码,但是对于不懂程序的用户来说基本无法修改,但是对于稍微有了解base64编码的童鞋,那么直接可以在线解码你的这个编码,所以呢!最后himi提醒大家,使用base64当中,大家可以书写一些算法结合base64来使用!这样即使明文也不怕,至于怎么做,himi就不再多说了 哈哈!

继续阅读