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的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