quick-cocos2dx lua中读取 加密 csv表

我很是想把一些非必需的信息以CSV表的格式保存到客户端,以减小和服务器的通信,下降压力。因而写了这么一个。php

但由于你们以为这样的话,须要每次登录时来检测同步这些数据,会减慢登录速度,因而没有用到。服务器

我以为往后服务器压力增大了之后,能够这么使用。app

整体上是两部分: 加密和读取。svn

1 加密ui

  使用quick自带的pack_files命令加密CSV文件。在quick\bin\pack_files.bat 具体使用方法可进去查看sample.加密

  启动程序时,告诉lua堆栈加密的密钥等。lua

具体代码以下spa

  打包时处理csv文件,记住yourkey yoursign 这是你本身设置的。code

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分别是两个字符串的长度。blog

 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,
相关文章
相关标签/搜索