Lua Table轉C# Dictionary

由於在遊戲公司作web後臺開發,常常會涉及到取遊戲服務器的數據庫裏面讀寫各類操做。git

昨天下午,服務器那邊讓我讀一個配置顯示到後臺,讓運營大佬們能夠在web後臺配置遊戲參數。github

原本覺得很簡單個事情,結果我讀出那個二進制的字段,竟然是這種格式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的虛擬機庫就是各類麻煩還不知道能不能解決的一些方案。。。。測試

博主好歹也是有四年+工做經驗的人了,沒有合適的就本身寫嘛,就當鍛鍊一下本身咯this

新建一個項目,取了一個好聽的名字SharpluaTablelua

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裏面spa

測試一下code

 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


 

若是對你有幫助,請我喝瓶水吧!


 

相關文章
相關標籤/搜索