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,
相關文章
相關標籤/搜索