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,欢迎Star https://github.com/QingChengCoder/LuaTableToCSharp


 

posted on   快乐海盗  阅读(4875)  评论(8编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示