原生平台 文件读取问题反馈

Creator 版本:2.0.10

目标平台: Android, Ios

问题描述:

使用 zip 命令 压缩 JSON 文件(使用命令: zip -q -r -o xxxx xxxxl),直接使用 FileUtils::getInstance()->getFileDataFromZip() 函数 和 使用 ZipFile 中的 getFileData 函数 均有概率出现 多余的字符, 通过其他软件压缩也是一样的。

图上第一个JSON 是 使用 ZipFile 中的 getFileData 函数 读取出来的

图上第二个JSON 是 使用 FileUtils::getInstance()->getFileDataFromZip() 函数 读取出来的

函数的第三个参数就是 字符串的长度 https://github.com/cocos-creator/cocos2d-x-lite/blob/7f320fa01140fc6e20b3a09083d624d89289b375/cocos/platform/CCFileUtils.cpp#L691 返回值并没有确保以'\0'结束。

如果把返回值转换为string, 可以参考下面的代码

auto *data = FileUtils::getInstance()->getFileDataFromZip(zipFilePath, filename, &dataSize);
std::string dataString(data, dataSize);
free(data);

由于这个文件可能是一个二进制文件,中间可能包含\0, 所以转换为string 需要慎重。

auto* data = _zipFile->getFileData(fileName, size);
std::string result((char*)data, *size);
free(data);
CCLOG("=============%ld=============", *size);
CCLOG("[%s]", result.c_str());

按照这样方式处理的,IOS 没有暂时没有出现这样的问题, 但是 Android这边还是有多余的字符或者数据不全

数据不全 可能是 CCLOG 的字符串超出缓存大小,被截取导致的.
可以输出长度 *size 进行确认解压结果是否正确