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
代码提交到了github,:https://github.com/qingchengcoder/luatabletocsharp,大家也可以本地下载
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对代码网的支持。
发表评论