看看引擎是在哪里载入文件数据的。
图片加密
经过调试跟踪,Sprite::create的调用堆栈如下:
Image::initWithImageFile
TextureCache::addImage
Sprite::initWithFile
Sprite::create
bool Image::initWithImageFile(const std::string& path)
{
bool ret = false;
//NOTE: fullPathForFilename isn't threadsafe. we should make sure the parameter is a full path.
// _filePath = FileUtils::getInstance()->fullPathForFilename(path);
_filePath = path;
Data data = FileUtils::getInstance()->getDataFromFile(_filePath);
if (!data.isNull())
{
ret = initWithImageData(data.getBytes(), data.getSize());
}
return ret;
}
这个方法是读取图片文件,然后获取byte数据流,并用这些数据初始化形成图片,现在我们要做的就是在获取到这些二进制数据之后,进行解密。
文件加密
文件数据的读取在不同平台上有不同的实现,
如果要在目标平台上做资源加密,就需要修改目标平台上的读取实现。
FileUtils是一个文件读取基类,提供有默认的实现,一些平台会提供特定的实现。
通过多态,FileUtils让我们的游戏客户端代码不需要对特定平台做特定处理,
也不需要关心FileUtils子类的类型。
读取方法在CCFileUtils.cpp getDataFromFile 和 getStringFromFile这两个方法。
加密部分
XOR加密是一种简单高效、非常安全的加密方法
逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算"。
它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。
JavaScript 语言的二进制运算,有一个专门的 XOR 运算符,写作^。
1 ^ 1 // 0
0 ^ 0 // 0
1 ^ 0 // 1
0 ^ 1 // 1
XOR 运算有一个很奇妙的特点:如果对一个值连续做两次 XOR,会返回这个值本身。
未完待续