我非常想把一些非必需的信息以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", , "yoursign", );

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 = , 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[])
info.column2 = itemArr[] or ""
info.column3 = checkint(itemArr[])
self.items[#self.items+] = 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 <= then
return content
end table.remove(list, ) -- 第一行是各字段说明 for i = , #list do
local linestr = string.ltrim(list[i])
if string.sub(linestr, , ) ~= "#" then -- #开头的行为注释行
local rows = string.split(linestr, ",")
content[#content + ] = 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,

quick-cocos2dx lua中读取 加密 csv表的更多相关文章

  1. cocos2d-x lua 中使用protobuf并对http进行处理

    cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链 ...

  2. Cocos2d-x Lua中帧动画

    帧动画就是按一定时间间隔.一定的顺序.一帧一帧地显示帧图片.我们的美工要为精灵的运动绘制每一帧图片,因此帧动画会由很多帧组成,按照一定的顺序切换这些图片就可以了. 在Cocos2d-x Lua中播放帧 ...

  3. Cocos2d-x Lua中使用标签

    游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字“COCOS2DX”,动态文字如图4-1所示游戏场景中的②号文字“Hello World”.静态文字一般是由美工使用Pho ...

  4. quick cocos2dx lua 内存释放

    前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...

  5. cocos2dx lua中继承与覆盖C++方法

    cocos2dx的extern.lua中的class方法为lua扩展了面向对象的功能,这使我们在开发中可以方便的继承原生类 但是用function返回对象的方法来继承C++类是没有super字段的,这 ...

  6. cocos2d-x lua中实现异步加载纹理

    原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html 前言   问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的 ...

  7. cocos2dx lua中异步加载网络图片,可用于显示微信头像

    最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能 ...

  8. Cocos2dx+lua中Color参数的坑

    cocos2x的lua中有如下几种颜色定义 --Color3B function cc.c3b( _r,_g,_b ) return { r = _r, g = _g, b = _b } end -- ...

  9. Cocos2d-x Lua中实例:帧动画使用

    下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. 帧动画实例 下面我们再看看具体的程序代码,首 ...

随机推荐

  1. vs调试时报503错误

    开发中遇到了一个神问题,困扰了几个月没解决. 在本机调试,或者用iis服务器直接指向项目目录,访问网页任何页面都是报503. 一直找不到原因,配置文件也修改了,还是解决不了. 今天20170110一次 ...

  2. Deeplearning——Logistics回归

    资料来源:1.博客:http://binweber.top/2017/09/12/deep_learning_1/#more——转载,修改更新 2.文章:https://www.qcloud.com/ ...

  3. MFC动态创建控件及其消息响应函数

    这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...

  4. YaoLingJump开发者日志(九)V1.1.1版本完成

    跳跃吧瑶玲下载连接 百度网盘下载 介绍   Android版本升级到8.0,发现原来的图标不显示了:   百度了一下解决方案,用了该博客提供的第二种方法,修改roundIcon的内容.   可爱的图标 ...

  5. idea快捷键操作

    在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了. psvm 也就是public static void main的首字母. 依次还有在方法体内键入f ...

  6. 不清楚System.Diagnostics.Process.Start(e.LinkText); 的含义

    using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms ...

  7. WITH REPLACE 含义

    RESTORE DATABASE db_CSharp from disk='backup.bak' WITH REPLACE WITH REPLACE后面是限定条件,with replace意思是替换 ...

  8. IO Model- 同步,异步,阻塞,非阻塞

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  9. 2011 Multi-University Training Contest 4 - Host by SDU

    A.Color the Simple Cycle(polya计数+字符串匹配) 此题的难点在于确定置换的个数,由a[i+k]=a[i], e[i+k]=e[i]联想到KMP. 于是把原串和原串扩大两倍 ...

  10. 【bzoj2435】[NOI2011]道路修建 树形dp

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...