当前位置 博文首页 > Lua Table转C# Dictionary的方法示例

    Lua Table转C# Dictionary的方法示例

    作者:青城大兄弟 时间:2021-01-31 21:10

    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,大家也可以本地下载

    总结

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

    js
    下一篇:没有了