1 #ifndef BASE_DATA 2 #include <string> 3 4 class BaseData 5 { 6 public: 7 BaseData(void); 8 ~BaseData(void); 9 10 std::string saveData(char const* bytes_to_encode,unsigned int in_len); 11 std::string parseData(std::string const& encoded_string); 12 13 }; 14 15 #endif
1 #include "BaseData.h" 2 3 static const std::string dataChars = 4 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 5 6 7 BaseData::BaseData(void) 8 { 9 } 10 11 BaseData::~BaseData(void) 12 { 13 } 14 static inline bool isData(unsigned char c) 15 { 16 return (isalnum(c) || (c == '+') || (c == '/')); 17 } 18 /*====================================== 19 函数名:saveData 20 参数: char const* bytes_to_encode--需要编码的目标字符串 21 unsigned int in_len --- 目标字符串长度 22 功能:对字符串数据进行编码 23 返回值:编码后的数据 24 ======================================*/ 25 std::string BaseData::saveData(char const* bytes_to_encode,unsigned int in_len) 26 { 27 std::string ret; 28 int i = 0; 29 int j = 0; 30 unsigned char char_array_3[3]; 31 unsigned char char_array_4[4]; 32 33 while(in_len--) 34 { 35 char_array_3[i++] = *(bytes_to_encode++); 36 if (i == 3) 37 { 38 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; 39 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); 40 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); 41 char_array_4[3] = char_array_3[2] & 0x3f; 42 43 for(int i = 0; (i < 4); i++) 44 ret += dataChars[char_array_4[i]]; 45 i = 0; 46 } 47 } 48 if (i) 49 { 50 for (j = i; j < 3; j++) 51 { 52 char_array_3[j] = '\0'; 53 } 54 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; 55 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); 56 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); 57 char_array_4[3] = char_array_3[2] & 0x3f; 58 for (j = 0; j < i + 1; j++) 59 { 60 ret += dataChars[char_array_4[j]]; 61 } 62 while ((i++ < 3)) 63 { 64 ret += "="; 65 } 66 } 67 return ret; 68 } 69 70 /*====================================== 71 函数名:parseData 72 参数:std::string const& encoded_string 73 需要编码的目标字符串 74 功能:对字符串数据进行解码 75 返回值:解码后的数据 76 ======================================*/ 77 std::string BaseData::parseData(std::string const& encoded_string) 78 { 79 int in_len = encoded_string.size(); 80 int i = 0; 81 int j = 0; 82 int in_ = 0; 83 unsigned char char_array_4[4],char_array_3[3]; 84 std::string ret; 85 while (in_len-- && (encoded_string[in_] != '=') && isData(encoded_string[in_])) 86 { 87 char_array_4[i++] = encoded_string[in_]; 88 in_ ++; 89 if (i == 4) 90 { 91 for (i = 0; i < 4; i++) 92 { 93 char_array_4[i] = dataChars.find(char_array_4[i]); 94 } 95 char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 96 char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 97 char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 98 for (i = 0; i < 3; i++) 99 ret += char_array_3[i]; 100 i = 0; 101 } 102 } 103 if (i) 104 { 105 for (j = i;j < 4; j++) 106 char_array_4[j] = 0; 107 for (j = 0; j < 4; j++) 108 char_array_4[j] = dataChars.find(char_array_4[j]); 109 char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); 110 char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); 111 char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; 112 113 for (j = 0; (j < i - 1); j++) 114 { 115 ret += char_array_3[j]; 116 } 117 } 118 return ret; 119 }
1 ////////////////////////////////////////////////////////////////////////// 2 //对base64编码的使用 3 BaseData bd; 4 std::string sValue = "newlist"; 5 //对存储的数据进行编码 6 std::string saveBaseString = bd.saveData(sValue.c_str(),sValue.length()); 7 //将编码后的数据进行存储 8 CCUserDefault::sharedUserDefault()->setStringForKey("Base",saveBaseString); 9 CCUserDefault::sharedUserDefault()->flush(); 10 11 //从存储中获取编码的数据 12 std::string loadBaseString = CCUserDefault::sharedUserDefault()->getStringForKey("Base"); 13 //对编码数据进行解码得到真是数据 14 std::string trueValue = bd.parseData(loadBaseString); 15 16 //用以观察数据 17 CCLabelTTF* label = CCLabelTTF::create("","Helvetica",20); 18 label->setPosition(ccp(240,185)); 19 addChild(label); 20 std::string logStr = "编码前的数据:"; 21 logStr += sValue; 22 logStr += "编码后的数据:"; 23 logStr += saveBaseString; 24 GBKToUTF(logStr); 25 label->setString(logStr.c_str()); 26 27 CCLabelTTF* label2 = CCLabelTTF::create("","Helvetica",20); 28 label2->setPosition(ccp(240,140)); 29 addChild(label2); 30 logStr = "解码前的数据:"; 31 logStr += loadBaseString; 32 logStr += "解码后的数据:"; 33 logStr += trueValue; 34 GBKToUTF(logStr); 35 label2->setString(logStr.c_str());