C#tolua間相互転送byte[]


C#tolua間相互転送byte[]


(金慶のコラム2020.8)
luaではstringとbyte[]を区別せず、C#ではstringとbyte[]間の変換は符号化に関連する.
C#では一般的にこのように回転します.
stringタイプからbyte[]:
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);

byte[]stringに移行:
string str = System.Text.Encoding.Default.GetString(byteArray);

Default符号化は、自機が現在使用している符号化であり、ASCII、UTF 8などの他の符号化も可能である.
luaに2進数データを読み込み、toluaを呼び出してエクスポートする方法を測定します.たとえば、次のようにします.
public void Print(string s)
{
    byte[] buf = Systen.Text.Encoding.Default.GetBytes(s);
    Debug.Log(Bitconvert.ToString(buf));
}

Default,ASCII,UTF 8,ISO-8859-1(Latin-1)を測定したところ,Unicodeが発見したbyte[]がエラーとなった.
C#でBufferを使ってみました.BlockCopy()メソッドstringをbyte arrayに変換するメソッドは、toluaからC#に伝わるstringが符号化されていることを発見し、直接コピーしても間違っている.
xluaにも同様の問題があります.Unity xluaはluaからbyte[]データをC#に転送します.MemoryStreamオブジェクトを使用してbyte[]データを転送します.確かに少し回ります.
toluaにはbyte[]を伝達するLuaByteBufferがある.tolua#のLuaByteBufferクラス
luaからbyte[]をC#に転送するには、パラメータstringをLuaByteBufferに変更するだけです.
public void Print(LuaByteBuffer luaByteBuffer)
{
    byte[] buf = luaByteBuffer.buffer;
    Debug.Log(Bitconvert.ToString(buf));
}

もっと正確で簡単な方法はLuaByteBufferAttributeを使うことです.
[LuaByteBufferAttribute]
public void Print(byte[] buf)
{
    Debug.Log(Bitconvert.ToString(buf));
}

最終的にLuaByteBufferAttributeが不要であることを発見し、byte[]を直接使えばよい.
public void Print(byte[] buf)
{
    Debug.Log(Bitconvert.ToString(buf));
}

C#転送byte[]からlua、デフォルトは「System.Byte[]」(userdata)で、tostring()からlua stringに移行できます.
s = tolua.tolstring(result)

可能であれば、データにラベル[LuaByteBufferAttribute]を付けてluaに渡すとstringになります.あるいはC#にLuaByteBufferを建ててbyte[]をluaに伝えます.