国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Lua Table轉C# Dictionary的方法示例

2024-07-21 23:05:03
字體:
來源:轉載
供稿:網友

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/265554.html">lua/270103.html">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"]);

lua,table,反轉,函數,字典

如果有多層級的,那就再new一個SharpLuaTable對象,再進行一次解析就好了

已經提交到Nuget上了,有需要使用大兄弟可以直接命令

Install-Package LuaTableToCSharp -Version 1.0.3

代碼提交到了github,:https://github.com/QingChengCoder/LuaTableToCSharp

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到lua頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 北辰区| 台安县| 渝中区| 德庆县| 绥宁县| 景谷| 武邑县| 蓝山县| 合作市| 大荔县| 三明市| 日喀则市| 随州市| 桃园市| 沁源县| 宁波市| 高邑县| 岑溪市| 平陆县| 喀什市| 萨迦县| 乌拉特中旗| 通江县| 石河子市| 博兴县| 裕民县| 托克逊县| 九台市| 衡东县| 凤山县| 甘肃省| 孟村| 古蔺县| 宁南县| 台北县| 铜梁县| 华亭县| 丹阳市| 吉首市| 宣威市| 阿拉尔市|