LuaテーブルからC#辞書への変換例
テーブル機能
文字列の場合、引用符と括弧を削除することができます。つまり、[]で囲まれていない場合、インデックスは文字列であるとみなされます。
は、テーブルのデフォルトの初期インデックスが一般に1から始まり、インデックスが書かれていない場合は、インデックスが数字であるとみなされ、1以降に自動的に順番に番号が振られます。
テーブルの変数は単なるアドレス参照であり、テーブル操作に対するデータ的な影響はない
テーブルは固定長ではなく、新しいデータが挿入されると自動的に長くなる
テーブルは、関数やテーブルなど、あらゆるタイプのデータを保持することができます。
テーブルのすべての要素を、常にカンマ「,」で区切ります。
導入
ゲーム会社の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のテーブルだと言ってました。簡単です、それだけです。(ここで数百字省略)
そして、私は
そして、先代のお兄さんたちが残した既成の車輪がないか、Webで検索してみました。結果は、lua vm virtual machine libraryを読み込むか、いくつかのプログラムで解決できるかどうか、まだわからないトラブルがいろいろとありました。
ブロガーは、少なくとも4年間+仕事の経験であり、自分自身のためのトレーニングとして、よく自分自身を記述するために適していません!
新たにプロジェクトを立ち上げ、SharpluaTableという素敵な名前をつけました。
{{コード
現在の旧解析クラスは1レベルしか解析しません、もし値valueが複数のレベルを持つ場合、私はデフォルトでvalueに解析しています
テストする
class SharpluaTable
{
string luatable = "";
// start parsing from {
//then split by equal sign, with a key-value pair before and after the equal sign
//After the comma, another key-value pair
//If you encounter { in the middle of the parsing, parse until }, all are values
Dictionary<string, string> dic = new Dictionary<string, string>();
public Dictionary<string, string> Parse(string luatable)
{
this.luatable = luatable;
//parse the 0 and last bits to determine if it is in luatable format
if (luatable[0] ! = '{')
{
throw new Exception("Parsing lua failed, format error");
}
if (luatable[luatable.Length - 1] ! = '}')
{
throw new Exception("Failed to parse lua, formatting error");
}
string luaKey = string.Empty, LuaValue = string.Empty;
// mark whether to parse Key or Value, if true, then parse into Key, if false, then parse into value
bool iskey = true;
for (int i = 1; i < luatable.Length; i++)
{ // if it is the last key-value pair, then it is directly finished if (i+1==luatable.Length&&luatable[i]=='}') { dic.Add(luaKey, LuaValue); luaKey = string.Empty; LuaValue = string.Empty; break; }
//If it is a comma, then store the current key value , skip the current character parsing
if (luatable[i] == ',')
{
dic.Add(luaKey, LuaValue);
luaKey = string.Empty;
LuaValue = string.Empty;
iskey = true; //skip a comma, then continue to parse as key
continue;
}
else
{
if (luatable[i] == '=')
{
iskey = false; //if it is equal, then resolve to key, and skip the current
continue;
}
//If it's a secondary {, then parse until } and move the current i value to the subscript position of }
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;
}
画像
複数のレベルがある場合は、別のSharpLuaTableオブジェクトを新規作成して、別のパースを行うだけです。
すでにNugetにコミットされているので、使う必要があれば、コマンドで
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"]);
コードはgithubにコミットされています、。 https://github.com/QingChengCoder また ローカルダウンロード
概要
上記はこの記事のすべての内容です、私はあなたの勉強や仕事のためのこの記事の内容は、特定の参照学習価値があることを願って、あなたが交換するメッセージを残すことができます質問がある場合は、BinaryDevelopのあなたのサポートに感謝します。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン