对Cocos2dX使用c++版的base64编码文件:
#include "DataBase64Himi.h" static const std::string dataChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; static inline bool baseData(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); } std::string himiSaveData(unsigned char const* bytes_to_encode, unsigned int in_len) { std::string ret; int i = 0; int j = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for(i = 0; (i <4) ; i++) ret += dataChars[char_array_4[i]]; i = 0; } } if (i) { for(j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) ret += dataChars[char_array_4[j]]; while((i++ < 3)) ret += '='; } return ret; } std::string himiParseData(std::string const& encoded_string) { int in_len = encoded_string.size(); int i = 0; int j = 0; int in_ = 0; unsigned char char_array_4[4], char_array_3[3]; std::string ret; while (in_len-- && ( encoded_string[in_] != '=') && baseData(encoded_string[in_])) { char_array_4[i++] = encoded_string[in_]; in_++; if (i ==4) { for (i = 0; i <4; i++) char_array_4[i] = dataChars.find(char_array_4[i]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (i = 0; (i < 3); i++) ret += char_array_3[i]; i = 0; } } if (i) { for (j = i; j <4; j++) char_array_4[j] = 0; for (j = 0; j <4; j++) char_array_4[j] = dataChars.find(char_array_4[j]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; } return ret; }
然后Himi封装好了两个函数:(这里我们假设存储游戏金币)
首先.h中,定义枚举变量(备注1)
enum
{
DATA_GOLD,
//金币
};
然后.h定义两个函数:(备注2)
//存储数据 void saveDataByKeyValue(int iKey, string sValue); //读取数据 int loadDataByKey(int iKey);
最后.cpp中函数具体实现代码:(备注3)
//存储 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,这里定义的两个方法,第一个函数:
//存储数据
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
->saveDataByKeyValue(DATA_GOLD,
"10000"
);
//base64读取数据
this
->loadDataByKey(DATA_GOLD);
代码是不是用起来很方面呢!哈哈,这就对啦,不能因为编码弄得乱78糟~OK,运行项目,控制台你将看到如下显示:
Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0
Cocos2d: cocos2d: GL_VENDOR: ImaginationTechnologies
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 inTextureAtlas: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就不再多说了 哈哈!
相关推荐
在cocos2d-x 3.x版本中,处理网络接收的Base64编码的图片数据并将其显示在精灵(Sprite)上是一项常见的任务。这通常涉及到网络请求、数据解码以及图像渲染等多个步骤。以下是详细的知识点说明: 1. **Base64编码**:...
总的来说,Cocos2d-x用户数据加密是一个涉及加密算法、数据编码以及持久化存储的过程。通过正确地实现这一过程,可以有效地保护游戏中的用户数据,增强应用的安全性。在实际开发中,还需要注意遵循各种平台的安全...
《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...
1. XXTEA算法原理:XXTEA使用四轮加密过程,通过对数据进行加法、异或和位移操作,实现数据的加密。它需要两个密钥参数,通过密钥与数据交互完成加密。 2. 在C++中的实现:`xxtea.cpp`和`xxtea.h`文件包含了XXTEA...
本文将详细讲解如何利用XXTEA算法对Cocos2dx中的JS资源和脚本进行加密,以及加密过程中的关键步骤和注意事项。 **XXTEA算法简介** XXTEA(Xexed TEA)是一种快速且安全的块加密算法,由David Wheeler和Ross J. ...
《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...
Cocos2dx是一个开源的游戏开发框架,它基于C++,并提供对多种编程语言的支持,包括Lua和JavaScript。本实例以"基于cocos2dx的一个小例子"为主题,展示了如何利用Cocos2dx进行游戏开发的基本流程,涵盖了人物行走、...
Cocos2dx是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,并且提供了多种语言接口,包括Lua和JavaScript。版本2.2.3是该框架的一个历史版本,它在游戏开发社区中广泛使用,因为它提供了丰富的功能和...
“cocos2dx单机大富翁游戏源码”是一个基于cocos2dx框架开发的休闲娱乐游戏项目,旨在为开发者提供一个学习和参考的实例,帮助他们理解和掌握cocos2dx引擎在实际游戏开发中的应用。下面,我们将深入探讨cocos2dx框架...
《cocos2dx 3.2制作的赛车游戏详解》 Cocos2dx是一款流行的开源游戏开发框架,基于C++,支持多平台开发,包括iOS、Android、Windows等。在cocos2dx 3.2版本中制作的赛车游戏,充分利用了这个框架的优势,为玩家提供...
在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它基于C++,并提供了对多种平台的支持,包括iOS。本资源包含了斗地主游戏的服务端和客户端代码,这为我们提供了一个深入理解如何构建一款跨平台游戏的机会。...
这个压缩包文件包含了"Cocos2dx 游戏源码",特别是针对一款名为"蜗蜗回家"的游戏。这款游戏同时适用于Android和iOS平台,意味着它利用了Cocos2d-x跨平台的能力。 Cocos2d-x是Cocos2d-x项目的早期版本,基于C++编写...
在Cocos2dx 2.x版本中播放MP4格式的视频文件是一项常见的需求,尤其是在开发游戏或者多媒体应用时。Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入...
《Cocos2dx开源游戏-光线迷宫》是一款基于Cocos2dx游戏引擎开发的迷宫探索类游戏,它借鉴了iOS平台上的类似玩法,为玩家带来富有挑战性的游戏体验。Cocos2dx是一个广受欢迎的开源游戏开发框架,以其高效、易用和跨...
【基于Cocos2dx的炸弹人游戏】是一个利用Cocos2dx框架开发的、采用C++编程语言实现的经典游戏项目。Cocos2dx是一个开源的游戏开发框架,它以C++作为主要的编程语言,同时也支持Lua和JavaScript。该框架以其高效、跨...
《cocos2dx 3.4 拼图游戏源代码及运行文件》是一个基于Cocos2d-x 3.4版本开发的拼图游戏项目,它提供了完整的源代码和可执行文件,让开发者和游戏爱好者能够深入学习和研究游戏开发的实践技巧。这个游戏包含了四关,...
利用CCUserDefault 的存储功能,实现判断程序是否是第一次运行。相关文章请参考博客:http://blog.csdn.net/u012945598/article/category/1764935
手游开发引擎 Cocos2DX.手机游戏开发
Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,大大提升了开发效率,其中CocosBuilder就是...
本文将深入探讨使用cocos2dx框架开发的2048游戏源码,帮助读者理解cocos2dx引擎的运用以及2048游戏的核心算法。 cocos2dx是一款开源的游戏开发框架,基于C++,它提供了丰富的2D和3D图形功能,使得开发者能够高效地...