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,

 

posted @ 2015-07-23 12:28  彼岸Elan  阅读(1813)  评论(0编辑  收藏  举报