读取加密后的图片
暂时没有想到更好的办法,只好修改了CCImage.cpp的源文件去判断图片是否加密,如果加密了,首先对其解密,再生成CCImage对象
// 首先包含xxtea的头文件,xxtea在cocos2dx已包含,无需单独提供,只需要正确引入即可
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "xxtea/xxtea.h"
#else
#include "external/xxtea/xxtea.h"
#endif
bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen)
{
bool ret = false;
do
{
CC_BREAK_IF(! data || dataLen <= 0);
unsigned char* unpackedData = nullptr;
ssize_t unpackedLen = 0;
//detect and unzip the compress file
if (ZipUtils::isCCZBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);
}
else if (ZipUtils::isGZipBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);
}
else
{
// 注释掉这个分支其余代码,如果图片数据data为加密的,必须首先解密才可正常使用
//unpackedData = const_cast<unsigned char*>(data);
//unpackedLen = dataLen;
//TODO:start
// 加密key
char* key = "testkey";
int key_len = strlen(key);
// 加密sign
const char* sign = "testsign";
int sign_len = strlen(sign);
xxtea_long len = 0;
// 如果加密的数据最开始几个字节如果与签名相符,则是加密的数据
int result = strncmp((const char*)data, sign, sign_len) == 0;
if (result) {
unpackedData = xxtea_decrypt((unsigned char*)data + sign_len,
(xxtea_long)dataLen - sign_len,
(unsigned char*)key,
(xxtea_long)key_len,
&len);
unpackedLen = len;
}
else {
unpackedData = const_cast<unsigned char*>(data);
unpackedLen = dataLen;
}
//TODO: end
}
在libcocos2d项目external右键新建筛选器命名xxtea然后添加现有项将xxtea.h和.cpp加进来