【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!

原创 2012年03月26日 10:27:23

本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/659.html

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

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

http://baike.baidu.com/view/469071.htm (百度百科的 base64详细解释)

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

【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;

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

base64.h以及base64.cpp  文件下载导入项目中:

  DataBase64Himi.zip (647 字节, 11 次)

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

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

1
2
3
4
enum{
    DATA_GOLD,//金币
 
};

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

1
2
3
4
5
//存储数据
void saveDataByKeyValue(int iKey, string sValue);
 
//读取数据
int loadDataByKey(int iKey);

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

1
2
3
4
5
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<const unsigned char*>(sValue.c_str()), sValue.length());
    CCLog("存储编码后的数据 key:index: Himi%i, value: %s  ",iKey,sKey.c_str());
    CCUserDefault::sharedUserDefault()->setStringForKey(buffer, sKey);
    CCUserDefault::sharedUserDefault()->flush();
}
 
//读取
int HelloWorld::loadDataByKey(int iKey){
    CCLog("----------读取");
    char buffer[32];
    sprintf(buffer, "%s%d", "Himi",iKey);
 
    string s = CCUserDefault::sharedUserDefault()->getStringForKey(buffer);
    CCLog("解码前的数据: %s  ",s.c_str());
    string parseKey = himiParseData(s);
    CCLog("解码后的数据: %s  ",parseKey.c_str());
    return atoi(parseKey.c_str());
}

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

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

1
2
//存储数据
    void saveDataByKeyValue(int iKey, string sValue);

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

第二个函数:

1
2
//读取数据
    int loadDataByKey(int iKey);

这个函数没什么好说的,传入的参数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”,大家不喜欢可以换成自己喜欢的,但是千万不要删除!因为一旦你删除掉,然后将存储后的形式为: <1>数据</1>  这样会造成你读取数据出错!

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

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

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

1
2
3
4
5
//base64编码存储
this->saveDataByKeyValue(DATA_GOLD, "10000");
 
//base64读取数据
this->loadDataByKey(DATA_GOLD);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

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

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

本篇源码下载:

  base64SaveDataForCocos2dx.zip (691 字节, 6 次)


cocos2d js 加密和编码

getMd5:function(code) {       return hex_md5(code);//进行md5加密 }, getEncode64:function(code) {  ...
  • vivi_12
  • vivi_12
  • 2017年02月07日 11:25
  • 837

[寒江孤叶丶的Cocos2d-x之旅_15]Cocos2d-x LUA脚本中对字符串进行Base64加解密/编解码 (LUA Base64 加解密/编解码)

Base64编码在传输数据的时候经常用到,例如:使用json传输如下的一段文字【小明说:"你好!"】 如果用json传输会出现许多问题,{"String":"小明说:"你好!""},这样的形式自然是错...
  • qq446569365
  • qq446569365
  • 2014年10月10日 21:19
  • 4639

express接收base64编码数据和文件存储

转自:http://marshal.easymorse.com/archives/4935 图片在浏览器的javascript中操作,只能是base64编码的文本。 比如从html5 canvas...
  • yuxiangji
  • yuxiangji
  • 2014年01月02日 10:40
  • 2361

COCOS2DX中对CCUserDefault保存的数据加密

~~~~本文章为 OwenTsang(fromOld-Boys-Studio)原创,转载务必在明显处注明:            原文连接:http://blog.csdn.net/owen_c...
  • Leeyehong_self
  • Leeyehong_self
  • 2014年09月11日 23:40
  • 704

Cocos2d-X 学习笔记 16 使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码加密

转载来至:http://blog.163.com/zhoulong19880518@126/blog/static/6070970220129851614575/ 上一篇介绍了,如何...
  • huahua12300
  • huahua12300
  • 2014年10月23日 10:44
  • 883

使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码加密

上一篇介绍了,如何使用Cocos2dX自带的CCUserDefault 存储游戏数据,那么Himi也提到此方式保存的为xml格式并且数据明文显示=。 =,这个对于我们开发者来说太暴漏了有木有! so~...
  • iphone86
  • iphone86
  • 2015年03月30日 10:46
  • 358

HTML5 和 Cocos2d-js 的cc.sys.localStorage本地存储到哪里了?

HTML5 和 Cocos2d-js 的cc.sys.localStorage本地存储到哪里了? cc.sys.localStorage存储的数据肯定要生成文件的吧,这个文件在windows和an...
  • u013007305
  • u013007305
  • 2016年08月26日 10:59
  • 2408

3DES+Base64 加密解密的方法

#import #import "GTMBase64.h"       // Open source,base64处理,就两个文件,自己从网上下载下吧 + (NSString*)TripleDE...
  • sjzsp
  • sjzsp
  • 2011年04月11日 10:57
  • 2107

【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!

转载自【黑米GameDev街区】原文链接: http://www.himigame.com/iphone-cocos2dx/653.html 上一篇介绍了,如何使用Cocos2dX自带的CC...
  • yc1404
  • yc1404
  • 2013年02月28日 14:03
  • 432

Cocos2d-X 学习笔记 16 使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码加密

转载来至:http://blog.163.com/zhoulong19880518@126/blog/static/6070970220129851614575/ 上一篇介绍了,如何...
  • huahua12300
  • huahua12300
  • 2014年10月23日 10:44
  • 883
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!
举报原因:
原因补充:

(最多只允许输入30个字)