因为在游戏公司做web后台开发,经常会涉及到取游戏服务器的数据库里面读写各种操作。

昨天下午,服务器那边让我读一个配置显示到后台,让运营大佬们可以在web后台配置游戏参数。

本来以为很简单个事情,结果我读出那个二进制的字段,居然是这种格式

{=,=,=,=,={},=,={=,s010GameConfig={s008wPayType=,s009wCostType=,s015dwReservedRule3=,s015dwReservedRule2=,s006ClubId=,s010wCostValue=,s010wCellScore=,s014wPlayCountRule=,s013wHadPlayCount=,s010dwPlayRule=,s010wSubGameID=,s009wMaxScore=,s015dwReservedRule1=,s015sPrivateTableID=}

服务器的兄弟告诉我,这是lua的table。。。很简单啦,就这样。。。(此处省略几百字)

然后我

然后我在网上搜索有么有前辈大佬留下的现成轮子。。。结果不是要加载一个lua vm的虚拟机库就是各种麻烦还不知道能不能解决的一些方案。。。。

博主好歹也是有四年+工作经验的人了,没有合适的就自己写嘛,就当锻炼一下自己咯

新建一个项目,取了一个好听的名字SharpluaTable

class SharpluaTable
{
string luatable = ""; //从{开始解析 //然后按等号分割,等号前后为一个键值对 //逗号之后,为另一个键值对 //如果遇到中途遇到{,一直解析到}为止,都为值 Dictionary<string, string> dic = new Dictionary<string, string>(); public Dictionary<string, string> Parse(string luatable)
{
this.luatable = luatable;
//解析0位和最后一位,判断是否是luatable格式 if (luatable[] != '{')
{
throw new Exception("解析lua失败,格式错误");
} if (luatable[luatable.Length - ] != '}')
{
throw new Exception("解析lua失败,格式错误");
}
string luaKey = string.Empty, LuaValue = string.Empty;
//标示解析Key还是Value,如果true,那么解析到Key里面,如果是false,那么解析到value里面
bool iskey = true; for (int i = ; i < luatable.Length; i++)
{
          //如果是最后一个键值对,那么直接就完了
                if (i+1==luatable.Length&&luatable[i]=='}')
                {
                    dic.Add(luaKey, LuaValue);
                    luaKey = string.Empty;
                    LuaValue = string.Empty;
                    
                    break;
                }
//如果是逗号,那么存储当前的key value ,跳过当前字符解析
if (luatable[i] == ',')
{
dic.Add(luaKey, LuaValue);
luaKey = string.Empty;
LuaValue = string.Empty;
iskey = true; //跳过一个逗号,那么继续解析为key
continue;
}
else
{
if (luatable[i] == '=')
{
iskey = false; //如果是等号,那么解析为key,并跳过当前
continue;
}
//如果是二级的{,那么解析到}为止,并把当前的i的值移动到}的下标位置
if (luatable[i] == '{')
{
//LuaValue += luatable[i];
int kuohaoCount = ;
for (int j = i; j < luatable.Length; j++)
{
LuaValue += luatable[j];
if (luatable[j]=='{')
{
kuohaoCount += ;
}
if (luatable[j]=='}')
{
kuohaoCount -= ; if (kuohaoCount==)
{
i = j;
break;
}
else
{
//kuohaoCount -= ;
}
}
}
}
else
{
if (iskey)
{
luaKey += luatable[i];
}
else
{
LuaValue += luatable[i];
}
} }
} return dic; }

目前前这个解析类只做了一层解析,如果value值有多层级,我默认把它解析到value里面

测试一下

 string luatable = "{1=0,2=0,3=0,4=2,5={},6=0,7={1=118,s010GameConfig={s008wPayType=0,s009wCostType=0,s015dwReservedRule3=3,s015dwReservedRule2=0,s006ClubId=0,s010wCostValue=0,s010wCellScore=1,s014wPlayCountRule=10,s013wHadPlayCount=0,s010dwPlayRule=0,s010wSubGameID=114,s009wMaxScore=0,s015dwReservedRule1=0,s015sPrivateTableID=0},s006GameID=114},8=1}";

            SharpluaTable lua = new SharpluaTable();
var dic = lua.Parse(luatable);
Console.WriteLine(dic[""]);
SharpluaTable luaitem = new SharpluaTable();
var items = luaitem.Parse(dic[""]);

如果有多层级的,那就再new一个SharpLuaTable对象,再进行一次解析就好了

已经提交到Nuget上了,有需要使用大兄弟可以直接命令

Install-Package LuaTableToCSharp -Version 1.0.3

代码提交到了github,欢迎Star https://github.com/QingChengCoder/LuaTableToCSharp


如果对你有帮助,请我喝瓶水吧!


Lua Table转C# Dictionary的更多相关文章

  1. lua table integer index 特性

    table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the t ...

  2. 树形打印lua table表

    为方便调试lua程序,往往想以树的形式打印出一个table,以观其表内数据.以下罗列了三种种关于树形打印lua table的方法;法一 local print = print local tconca ...

  3. lua table 排序--满足多条件排序

    前提 假设 一个小怪 有三种属性,等级(level).品质(quality).id(pid) 我们需要对他们进行排序,两种排序情况,第一是单一属性排序,比如按照等级进行排序,或者多种属性进行优先级排序 ...

  4. cocos2d-x lua table数据存储

    cocos2d-x lua table数据存储 version: cocos2d-x 3.6 1. 将table转为json http://blog.csdn.net/songcf_faith/art ...

  5. cocos2d-x lua table与json的转换

    cocos2d-x lua table与json的转换 version: cocos2d-x 3.6 1.引入json库 require("src/cocos/cocos2d/json&qu ...

  6. Lua table使用

    days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...

  7. lua table表

    lua table表 语法结构 创建一个 table 直接使用 "{}" 即可 table1 = {} -- 赋值 table1["name"] = " ...

  8. lua table表判断是否为空

    官方手册里早已经给了答案,那就是靠lua内置的next函数 即如此用: a = {} if next(a) == nil then next其实就是pairs遍历table时用来取下一个内容的函数. ...

  9. 关于 lua table表存储函数且运用

    --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意类型的值来做数组的索引,但这个值不能是nil--lua tabl ...

随机推荐

  1. 【转】 linux下的awk程序执行

    #!/bin/awk -f awk脚本开头使用这个命令,赋予这个文本文件以执行的权限.这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了. BEGIN和END的大括号必须紧 ...

  2. PHPUnit使用教程——PHP环境变量+x-debug+composer+phpunit配置安装(超详细!)

    注意:Windows系统 一.提前入坑点:要求php5.6,7.0,7.1,不论使用集成版还是非集成版的小伙伴都要好好查看自己的php版本,个人的版本居然是5.5.X的,哭唧唧.不过别担心,爸爸教你升 ...

  3. shell中数组讲解

    定义数组 在Shell中,用括号来表示数组,数组元素用"空格"符号分割开.定义数组的一般形式为: 代码如下: 数组名=(值1 值2 ... 值n) 例如: 代码如下: array_ ...

  4. Java对List进行分页

    Java对组装的List分页 以前一直是在DAO层直接从数据库里分页,但是今天因为有些数据,需要混合展示,就是根据条件取出了多个对象的集合,然后把这些多个List放到一个List里,然后在从这个Lis ...

  5. c# 实现mysql事务

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. iOS-UITableviewcell分割线位置

    这几天又遇到要调节列表分割线位置,就想起很久以前刚做时的做法:把自带的分割线隐藏,然后自己加一条UIView,哈哈,不过这一两年不那么干了,把这个方法贴出来: 在 Tableview 的代理方法中,实 ...

  7. java中Queue简介

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 offer,add区别:一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝.这时新的 offer 方法 ...

  8. CheckStyle

    在Eclipse当中安装CheckStyle插件非常方便,和安装FindBugs除了URL有区别之外,其他的几乎完全一样.我们可以参照以下几个步骤进行(注意一下,eclipse版本不一样,可能安装插件 ...

  9. Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)

    <Windows Azure Platform 系列文章目录> PowerShell我已经提交到GitHub: https://github.com/leizhang1984/AzureC ...

  10. MySQL Community Server 5.7安装详细步骤

    mysql社区版安装配置步骤较繁琐,几经搜索之后才成功安装,此文将所有的安装步骤及安装过程中遇到的问题进行了总结 1. 下载MySQL社区版     最新版下载地址:https://dev.mysql ...