1. ホーム
  2. スクリプト・コラム
  3. ルア

LuaテーブルからC#辞書への変換例

2022-01-06 04:43:54

テーブル機能

文字列の場合、引用符と括弧を削除することができます。つまり、[]で囲まれていない場合、インデックスは文字列であるとみなされます。

は、テーブルのデフォルトの初期インデックスが一般に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のあなたのサポートに感謝します。