上一篇介紹了,如何使用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 檔案下載下傳導入項目中:
然後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("----------讀取");
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
<code>//存儲資料</code>
<code> </code><code>void</code> <code>saveDataByKeyValue(</code><code>int</code> <code>iKey, string sValue);</code>
其中第一個函數傳入一個int值,為什麼要這樣,原因是這樣友善與結合枚舉變量(備注1)來進行存儲,這樣使用的時候非常簡化你的代碼和步驟;第二個函數是值,這裡我封裝成string,這樣為了更好的結合我們的base64加密!這點在(備注3)中展現!
第二個函數:
<code>//讀取資料</code>
<code> </code><code>int</code> <code>loadDataByKey(</code><code>int</code> <code>iKey);</code>
這個函數沒什麼好說的,傳入的參數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: 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
存儲的檔案内容截圖如下:
<a href="http://www.himigame.com/wp-content/uploads/2012/03/1232.png"></a>
OK,最後呢,我要說一點,雖然我們使用base64可以對資料進行加密,但是對于不懂程式的使用者來說基本無法修改,但是對于稍微有了解base64加密的童鞋,那麼直接可以線上解碼你的這個加密,是以呢!最後Himi提醒大家,使用base64當中,大家可以書寫一些算法結合base64來使用!這樣即使明文也不怕,至于怎麼做,Himi就不再多說了 哈哈!
本篇源碼下載下傳:
本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/817095,如需轉載請自行聯系原作者