C#tolua間相互転送byte[]
1798 ワード
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に伝えます.
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
string str = System.Text.Encoding.Default.GetString(byteArray);
public void Print(string s)
{
byte[] buf = Systen.Text.Encoding.Default.GetBytes(s);
Debug.Log(Bitconvert.ToString(buf));
}
public void Print(LuaByteBuffer luaByteBuffer)
{
byte[] buf = luaByteBuffer.buffer;
Debug.Log(Bitconvert.ToString(buf));
}
[LuaByteBufferAttribute]
public void Print(byte[] buf)
{
Debug.Log(Bitconvert.ToString(buf));
}
public void Print(byte[] buf)
{
Debug.Log(Bitconvert.ToString(buf));
}
s = tolua.tolstring(result)