Lua Table转C# Dictionary

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Lua Table转C# Dictionary

因为在游戏公司做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,欢迎Starhttps://github.com/QingChengCoder/LuaTableToCSharp


目录
相关文章
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
95 0
|
6月前
|
关系型数据库 MySQL
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
MySQL 报错 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file
913 0
|
存储 安全 搜索推荐
c#集合_键值对Dictionary & SortedList
在 C# 中,键值对是一种常见的数据结构,可以使用不同的集合类实现。以下是常用的键值对集合类::一种使用哈希表实现的键值对集合。它通过将键哈希为桶号,然后将值存储在桶中进行快速查找。:一种基于数组实现的键值对集合。它会将键值对按照键排序并存储在数组中,以支持快速访问、查找和枚举。:一种使用红黑树实现的键值对集合。它能够按照键的排序进行快速查找,也可以快速地插入和删除键值对,并且该树具备自平衡的特性,使得插入、删除和搜索性能都非常优秀。
145 1
|
6月前
|
开发框架 .NET C#
C# Dictionary<string, string> 对key做筛选
C# Dictionary<string, string> 对key做筛选
71 2
|
XML Java 数据格式
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
lua遍历table的方式、运算符、math库、字符串操作方法
684 0
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
C#中字典Dictionary的用法详解
C#中字典Dictionary的用法详解
C#List与ArrayList,Hashtable与Dictionary总结
C#List与ArrayList,Hashtable与Dictionary总结
52 0
C#List与ArrayList,Hashtable与Dictionary总结
C#由Dictionary赋值引发的对引用类型使用的思考
C#由Dictionary赋值引发的对引用类型使用的思考
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
148 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数