Lua Table转C# Dictionary的方法示例

 更新时间:2018年03月09日 08:52:54   作者:青城大兄弟  
这篇文章主要给大家介绍了关于Lua Table转C# Dictionary的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

table特性

table是一个“关联数组”,数组的索引可以是数字或者是字符串,所有索引值都需要用 "["和"]" 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引

table 的默认初始索引一般以 1 开始,如果不写索引,则索引就会被认为是数字,并按顺序自动从1往后编;

table 的变量只是一个地址引用,对 table 的操作不会产生数据影响

table 不会固定长度大小,有新数据插入时长度会自动增长

table 里保存数据可以是任何类型,包括function和table;

table所有元素之间,总是用逗号 "," 隔开;

引言

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

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

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

{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}

服务器的兄弟告诉我,这是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[0] != '{')
  {
  throw new Exception("解析lua失败,格式错误");
  }

  if (luatable[luatable.Length - 1] != '}')
  {
  throw new Exception("解析lua失败,格式错误");
  }
  string luaKey = string.Empty, LuaValue = string.Empty;
  //标示解析Key还是Value,如果true,那么解析到Key里面,如果是false,那么解析到value里面
  bool iskey = true;


  for (int i = 1; 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 = 0;
   for (int j = i; j < luatable.Length; j++)
   {
    LuaValue += luatable[j];
    if (luatable[j]=='{')
    {
    kuohaoCount += 1;
    }
    if (luatable[j]=='}')
    {
    kuohaoCount -= 1;

    if (kuohaoCount==0)
    {
     i = j;
     break;
    }
    else
    {
     //kuohaoCount -= 1;
    }
    }
   }
   }
   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["7"]);
   SharpluaTable luaitem = new SharpluaTable();
    var items = luaitem.Parse(dic["7"]);

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

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

Install-Package LuaTableToCSharp -Version 1.0.3

代码提交到了github,:https://github.com/QingChengCoder/LuaTableToCSharp,大家也可以本地下载

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对程序员之家的支持。

相关文章

  • Lua中的闭合函数、非全局函数与函数的尾调用详解

    Lua中的闭合函数、非全局函数与函数的尾调用详解

    这篇文章主要介绍了Lua中的闭合函数、非全局函数与函数的尾调用详解,本文对这2种函数和尾调用做了深入研究,需要的朋友可以参考下
    2014-09-09
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table实现的其它5种数据结构

    这篇文章主要介绍了Lua中使用table实现的其它5种数据结构,本文用table为基础,实现了数组、链表、队列、集合等数据类型,需要的朋友可以参考下
    2014-09-09
  • Lua读写文件代码示例

    Lua读写文件代码示例

    这篇文章主要介绍了Lua读写文件代码示例,本文讲解了读写文件的模式以及读写文件代码实例,需要的朋友可以参考下
    2015-04-04
  • Lua实现类继承

    Lua实现类继承

    这里给大家演示的是一个使用lua实现类继承的示例,实现类继承其实有很多种写法,这里是本人常用的方法,推荐给大家。
    2015-03-03
  • Lua性能优化技巧(一):前言

    Lua性能优化技巧(一):前言

    这篇文章主要介绍了Lua性能优化技巧(一):前言,本文讲解了2条优化原则,本文是系列文章的第一篇,需要的朋友可以参考下
    2015-04-04
  • Lua中的元表与元方法学习总结

    Lua中的元表与元方法学习总结

    这篇文章主要介绍了Lua中的元表与元方法学习总结,本文讲解了算术类的元方法、__tostring元方法等内容,需要的朋友可以参考下
    2014-09-09
  • Lua中for循环语句的使用教程

    Lua中for循环语句的使用教程

    这篇文章主要介绍了Lua中for循环语句的使用教程,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua学习笔记之表达式

    Lua学习笔记之表达式

    在Lua中,表达式包括:数值常量、字符串字面值、变量、单目和双目运算符,函数调用,也包括一些非传统的函数定义和表结构。今天我们就来详细了解下lua中的表达式
    2015-04-04
  • Lua中的迭代器(iterator)浅析

    Lua中的迭代器(iterator)浅析

    这篇文章主要介绍了Lua中的迭代器(iterator)浅析,本文讲解了pairs迭代器和、ipairs迭代器,同时提及了io.lines、string.gmatch、迭代器与Closure(闭包)等内容,需要的朋友可以参考下
    2014-09-09
  • Lua中的数学库总结

    Lua中的数学库总结

    这篇文章主要介绍了Lua中的数学库总结,本文罗列了Lua5.1中数学库的所有函数,需要的朋友可以参考下
    2014-11-11

最新评论

?


http://www.vxiaotou.com