由於在遊戲公司作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
若是對你有幫助,請我喝瓶水吧!