table特性
table是一個(gè)“關(guān)聯(lián)數(shù)組”,數(shù)組的索引可以是數(shù)字或者是字符串,所有索引值都需要用 "["和"]" 括起來(lái);如果是字符串,還可以去掉引號(hào)和中括號(hào); 即如果沒(méi)有[]括起,則認(rèn)為是字符串索引
table 的默認(rèn)初始索引一般以 1 開(kāi)始,如果不寫(xiě)索引,則索引就會(huì)被認(rèn)為是數(shù)字,并按順序自動(dòng)從1往后編;
table 的變量只是一個(gè)地址引用,對(duì) table 的操作不會(huì)產(chǎn)生數(shù)據(jù)影響
table 不會(huì)固定長(zhǎng)度大小,有新數(shù)據(jù)插入時(shí)長(zhǎng)度會(huì)自動(dòng)增長(zhǎng)
table 里保存數(shù)據(jù)可以是任何類(lèi)型,包括function和table;
table所有元素之間,總是用逗號(hào) "," 隔開(kāi);
引言
因?yàn)樵谟螒蚬咀鰓eb后臺(tái)開(kāi)發(fā),經(jīng)常會(huì)涉及到取游戲服務(wù)器的數(shù)據(jù)庫(kù)里面讀寫(xiě)各種操作。
昨天下午,服務(wù)器那邊讓我讀一個(gè)配置顯示到后臺(tái),讓運(yùn)營(yíng)大佬們可以在web后臺(tái)配置游戲參數(shù)。
本來(lái)以為很簡(jiǎn)單個(gè)事情,結(jié)果我讀出那個(gè)二進(jìn)制的字段,居然是這種格式
{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}
服務(wù)器的兄弟告訴我,這是lua的table。。。很簡(jiǎn)單啦,就這樣。。。(此處省略幾百字)
然后我
然后我在網(wǎng)上搜索有么有前輩大佬留下的現(xiàn)成輪子。。。結(jié)果不是要加載一個(gè)lua vm的虛擬機(jī)庫(kù)就是各種麻煩還不知道能不能解決的一些方案。。。。
博主好歹也是有四年+工作經(jīng)驗(yàn)的人了,沒(méi)有合適的就自己寫(xiě)嘛,就當(dāng)鍛煉一下自己咯
新建一個(gè)項(xiàng)目,取了一個(gè)好聽(tīng)的名字SharpluaTable
class SharpluaTable
{
string luatable = "";
//從{開(kāi)始解析
//然后按等號(hào)分割,等號(hào)前后為一個(gè)鍵值對(duì)
//逗號(hào)之后,為另一個(gè)鍵值對(duì)
//如果遇到中途遇到{,一直解析到}為止,都為值
Dictionarystring, string> dic = new Dictionarystring, string>();
public Dictionarystring, string> Parse(string luatable)
{
this.luatable = luatable;
//解析0位和最后一位,判斷是否是luatable格式
if (luatable[0] != '{')
{
throw new Exception("解析lua失敗,格式錯(cuò)誤");
}
if (luatable[luatable.Length - 1] != '}')
{
throw new Exception("解析lua失敗,格式錯(cuò)誤");
}
string luaKey = string.Empty, LuaValue = string.Empty;
//標(biāo)示解析Key還是Value,如果true,那么解析到Key里面,如果是false,那么解析到value里面
bool iskey = true;
for (int i = 1; i luatable.Length; i++)
{ //如果是最后一個(gè)鍵值對(duì),那么直接就完了 if (i+1==luatable.Lengthluatable[i]=='}') { dic.Add(luaKey, LuaValue); luaKey = string.Empty; LuaValue = string.Empty; break; }
//如果是逗號(hào),那么存儲(chǔ)當(dāng)前的key value ,跳過(guò)當(dāng)前字符解析
if (luatable[i] == ',')
{
dic.Add(luaKey, LuaValue);
luaKey = string.Empty;
LuaValue = string.Empty;
iskey = true; //跳過(guò)一個(gè)逗號(hào),那么繼續(xù)解析為key
continue;
}
else
{
if (luatable[i] == '=')
{
iskey = false; //如果是等號(hào),那么解析為key,并跳過(guò)當(dāng)前
continue;
}
//如果是二級(jí)的{,那么解析到}為止,并把當(dāng)前的i的值移動(dòng)到}的下標(biāo)位置
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;
}
目前前這個(gè)解析類(lèi)只做了一層解析,如果value值有多層級(jí),我默認(rèn)把它解析到value里面
測(cè)試一下
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"]);
如果有多層級(jí)的,那就再new一個(gè)SharpLuaTable對(duì)象,再進(jìn)行一次解析就好了
已經(jīng)提交到Nuget上了,有需要使用大兄弟可以直接命令
Install-Package LuaTableToCSharp -Version 1.0.3
代碼提交到了github,:https://github.com/QingChengCoder/LuaTableToCSharp,大家也可以本地下載
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- ToLua框架下C#與Lua代碼的互調(diào)操作
- C#泛型方法在lua中表示的一種設(shè)計(jì)詳解
- C#和lua相互調(diào)用的方法教程
- 如何在C#中集成Lua腳本