quick-cocos2dx lua中读取 加密 csv表
我非常想把一些非必需的信息以CSV表的格式保存到客户端,以减少和服务器的通讯,降低压力。于是写了这么一个。
但因为大家觉得这样的话,需要每次登陆时来检测同步这些数据,会减慢登陆速度,于是没有用到。
我觉得日后服务器压力增大了以后,可以这么使用。
总体上是两部分: 加密和读取。
1 加密
使用quick自带的pack_files命令加密CSV文件。在quick\bin\pack_files.bat 具体使用方法可进去查看sample.
启动程序时,告诉lua堆栈加密的密钥等。
具体代码如下
打包时处理csv文件,记住yourkey yoursign 这是你自己设置的。
echo - encrypt res\csv\*.* to res\csvnew\ %QUICK_V3_ROOT%\quick\bin\win32\php.exe %QUICK_V3_ROOT%\quick\bin\lib\pack_files.php -i %APP_ANDROID_ROOT%assets\res\csv -o %APP_ANDROID_ROOT%assets\res\csvnew -es XXTEA -ek yourkey -es yoursign if exist "%APP_ANDROID_ROOT%assets\res\csv" rmdir /s /q "%APP_ANDROID_ROOT%assets\res\csv" ren %APP_ANDROID_ROOT%assets\res\csvnew csv
AppDelegate.cpp中告诉C++你使用的key和sign, 7, 8分别是两个字符串的长度。
LuaStack *pStack = pEngine->getLuaStack(); pStack->setXXTEAKeyAndSign("yourkey", 7, "yoursign", 8);
2 读取。大概的思路是我们要从res目录下读取文件,而且这个文件是加密过的。
所以要注意以下两点:
文件全路径获取方法是用的是 cc.FileUtils:getInstance():fullPathForFilename()
读取文件内容时方法是 cc.HelperFunc:getFileData()
具体代码如下
单独的loader目录用来加载所有的文件。myapp.lua中,增加调用入口
require("app.loader.init")
init.lua
LoaderPath = "csv/" import(".LoaderA").new() import(".LoaderB").new()
某一个LoaderA.lua
local CSVReader = require("utils.CSVReader").new() local LoaderA = class("LoaderA") function LoaderA:ctor() self.fn = "A.csv" self.items = {} self:load() end function LoaderA:load() self.rows = CSVReader:load(LoaderPath..self.fn) if not self.rows then return end local len = #self.rows for i = 1, len do local item = self.rows[i] self:parseColumn(item) end printInfo("LoaderA end: %d ", len) end function LoaderA:parseColumn(itemArr) local info = {} info.column1 = checkint(itemArr[1]) info.column2 = itemArr[2] or "" info.column3 = checkint(itemArr[3]) self.items[#self.items+1] = info end return LoaderA
CSVReader.lua
local CSVReader = class("CSVReader") function CSVReader:ctor() end function CSVReader:load(filename) self.fn = cc.FileUtils:getInstance():fullPathForFilename(filename) local fileExits = cc.FileUtils:getInstance():isFileExist(self.fn) if not fileExits then printError("file not exist %s", self.fn) return nil end -- 这里使用cc.HelperFunc:getFileData() 而非 cc.FileUtils:getInstance():getStringFromFile(self.fn) -- 就是因为加密了 local str = cc.HelperFunc:getFileData(self.fn) return self:parse(str) end function CSVReader:parse(str) local content = {} local list = string.split(str, "\r\n") if #list <= 1 then return content end table.remove(list, 1) -- 第一行是各字段说明 for i = 1, #list do local linestr = string.ltrim(list[i]) if string.sub(linestr, 1, 1) ~= "#" then -- #开头的行为注释行 local rows = string.split(linestr, ",") content[#content + 1] = rows end end return content end return CSVReader
A.csv
#column1,#column2,#column3,
10000,lang10000,1,
10001,lang10001,1,
10002,lang10002,1,
10003,lang10003,1,