zoukankan      html  css  js  c++  java
  • quick-cocos2dx lua中读取 加密 csv表

    我非常想把一些非必需的信息以CSV表的格式保存到客户端,以减少和服务器的通讯,降低压力。于是写了这么一个。

    但因为大家觉得这样的话,需要每次登陆时来检测同步这些数据,会减慢登陆速度,于是没有用到。

    我觉得日后服务器压力增大了以后,可以这么使用。

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

    1 加密

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

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

    具体代码如下

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

    echo - encrypt rescsv*.* to rescsvnew
    %QUICK_V3_ROOT%quickinwin32php.exe %QUICK_V3_ROOT%quickinlibpack_files.php -i %APP_ANDROID_ROOT%assets
    escsv -o %APP_ANDROID_ROOT%assets
    escsvnew -es XXTEA -ek yourkey -es yoursign
    
    if exist "%APP_ANDROID_ROOT%assets
    escsv" rmdir /s /q "%APP_ANDROID_ROOT%assets
    escsv"
    ren %APP_ANDROID_ROOT%assets
    escsvnew 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, "
    ")
    
        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,
  • 相关阅读:
    《勇敢的心》
    笔记本要来啦
    DataSet学习笔记
    俺终于可以回家了
    没有事做,好无聊
    TSQL语句实现清空数据库数据的代码,保留原有表形式和各种约束
    查询重复数据的SQL语句
    DataTable详解
    索引使用大全
    char和byte的转换
  • 原文地址:https://www.cnblogs.com/lan0725/p/4670113.html
Copyright © 2011-2022 走看看