table特性
table是一個“關(guān)聯(lián)數(shù)組”,數(shù)組的索引可以是數(shù)字或者是字符串,所有索引值都需要用 "["和"]" 括起來;如果是字符串,還可以去掉引號和中括號; 即如果沒有[]括起,則認(rèn)為是字符串索引
table 的默認(rèn)初始索引一般以 1 開始,如果不寫索引,則索引就會被認(rèn)為是數(shù)字,并按順序自動從1往后編;
table 的變量只是一個地址引用,對 table 的操作不會產(chǎn)生數(shù)據(jù)影響
table 不會固定長度大小,有新數(shù)據(jù)插入時長度會自動增長
table 里保存數(shù)據(jù)可以是任何類型,包括function和table;
table所有元素之間,總是用逗號 "," 隔開;
引言
因?yàn)樵谟螒蚬咀鰓eb后臺開發(fā),經(jīng)常會涉及到取游戲服務(wù)器的數(shù)據(jù)庫里面讀寫各種操作。
昨天下午,服務(wù)器那邊讓我讀一個配置顯示到后臺,讓運(yùn)營大佬們可以在web后臺配置游戲參數(shù)。
本來以為很簡單個事情,結(jié)果我讀出那個二進(jìn)制的字段,居然是這種格式
1
|
{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。。。很簡單啦,就這樣。。。(此處省略幾百字)
然后我
然后我在網(wǎng)上搜索有么有前輩大佬留下的現(xiàn)成輪子。。。結(jié)果不是要加載一個lua vm的虛擬機(jī)庫就是各種麻煩還不知道能不能解決的一些方案。。。。
博主好歹也是有四年+工作經(jīng)驗(yàn)的人了,沒有合適的就自己寫嘛,就當(dāng)鍛煉一下自己咯
新建一個項目,取了一個好聽的名字SharpluaTable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
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; //標(biāo)示解析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; } //如果是逗號,那么存儲當(dāng)前的key value ,跳過當(dāng)前字符解析 if (luatable[i] == ',' ) { dic.Add(luaKey, LuaValue); luaKey = string .Empty; LuaValue = string .Empty; iskey = true ; //跳過一個逗號,那么繼續(xù)解析為key continue ; } else { if (luatable[i] == '=' ) { iskey = false ; //如果是等號,那么解析為key,并跳過當(dāng)前 continue ; } //如果是二級的{,那么解析到}為止,并把當(dāng)前的i的值移動到}的下標(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; } |
目前前這個解析類只做了一層解析,如果value值有多層級,我默認(rèn)把它解析到value里面
測試一下
1
2
3
4
5
6
7
|
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對象,再進(jìn)行一次解析就好了
已經(jīng)提交到Nuget上了,有需要使用大兄弟可以直接命令
1
|
Install-Package LuaTableToCSharp -Version 1.0.3 |
代碼提交到了github,:https://github.com/QingChengCoder/LuaTableToCSharp
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:http://www.cnblogs.com/boxrice/p/8512790.html