上一篇介绍了,如何使用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 文件下载导入项目中:[download id=”63″]
然后Himi封装好了两个函数:(这里我们假设存储游戏金币)
首先.h中,定义枚举变量(备注1)
|
enum
{
DATA_GOLD
,
//金币
}
;
|
然后.h定义两个函数:(备注2)
|
//存储数据
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
&
lt
;
const
unsigned
char
*
&
gt
;
(
sValue
.
c_str
(
)
)
,
sValue
.
length
(
)
)
;
CCLog
(
"存储编码后的数据 key:index: Himi%i, value: %s "
,
iKey
,
sKey
.
c_str
(
)
)
;
CCUserDefault
::
sharedUserDefault
(
)
-
&
gt
;
setStringForKey
(
buffer
,
sKey
)
;
CCUserDefault
::
sharedUserDefault
(
)
-
&
gt
;
flush
(
)
;
}
//读取
int
HelloWorld
::
loadDataByKey
(
int
iKey
)
{
CCLog
(
"----------读取"
)
;
char
buffer
[
32
]
;
sprintf
(
buffer
,
"%s%d"
,
"Himi"
,
iKey
)
;
string
s
=
CCUserDefault
::
sharedUserDefault
(
)
-
&
gt
;
getStringForKey
(
buffer
)
;
CCLog
(
"解码前的数据: %s "
,
s
.
c_str
(
)
)
;
string
parseKey
=
himiParseData
(
s
)
;
CCLog
(
"解码后的数据: %s "
,
parseKey
.
c_str
(
)
)
;
return
atoi
(
parseKey
.
c_str
(
)
)
;
}
|
OK,这里开始逐步解释一下:
首先说下备注2,这里定义的两个方法,第一个函数:
|
//存储数据
void
saveDataByKeyValue
(
int
iKey
,
string
sValue
)
;
|
其中第一个函数传入一个int值,为什么要这样,原因是这样方便与结合枚举变量(备注1)来进行存储,这样使用的时候非常简化你的代码和步骤;第二个函数是值,这里我封装成string,这样为了更好的结合我们的base64编码!这点在(备注3)中体现!
第二个函数:
|
//读取数据
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扔出!
这其中应该说没什么难于理解的,所以这里不再赘述了;
那么下面我们来看这两个函数如何使用:
|
//base64编码存储
this
-
&
gt
;
saveDataByKeyValue
(
DATA_GOLD
,
"10000"
)
;
//base64读取数据
this
-
&
gt
;
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” 下载地址: http://vdisk.weibo.com/s/hq0Pq