# C# tolua 之間互傳 byte[]
(金慶的專欄 2020.8)
lua中不區(qū)分 string 和 byte[], 而在 C# 中 string 和 byte[] 之間轉(zhuǎn)換涉及編碼。
C# 中一般這樣轉(zhuǎn):
string類型轉(zhuǎn)成byte[]:
```
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
```
byte[]轉(zhuǎn)成string:
```
string str = System.Text.Encoding.Default.GetString(byteArray);
```
Default 編碼是本機當(dāng)前所用編碼,還可以用 ASCII, UTF8 等其他編碼。
測了在 lua 中讀入一塊2進(jìn)制數(shù)據(jù),調(diào)用 tolua 導(dǎo)出的一個方法,如:
```
public void Print(string s)
{
byte[] buf = Systen.Text.Encoding.Default.GetBytes(s);
Debug.Log(Bitconvert.ToString(buf));
}
```
測了 Default, ASCII, UTF8, ISO-8859-1(Latin-1), Unicode 發(fā)現(xiàn)得到的 byte[] 會出錯。
也試了 [C#中使用Buffer.BlockCopy()方法將string轉(zhuǎn)換為byte array的方法](https://www.cnblogs.com/ChineseMoonGod/p/5689526.html)
發(fā)現(xiàn) tolua 傳到 C# 的 string 已經(jīng)是編碼過的,直接復(fù)制也是錯的。
xlua 也有相同問題,[Unity xlua 從lua傳遞byte[]數(shù)據(jù)到C#](https://www.jianshu.com/p/63987134c1ba)
使用 MemoryStream對象來傳遞byte[]數(shù)據(jù),確實有點繞。
tolua 中有個 LuaByteBuffer,可以用來傳遞 byte[].
[tolua#中的LuaByteBuffer類](http://bbs.ulua.org/article/ulua/toluazhongdeluabytebufferlei.html)
從 lua 傳 byte[] 到 C#, 只需要將參數(shù) 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));
}
```
最終發(fā)現(xiàn)不需要 LuaByteBufferAttribute,直接用 byte[] 就行:
```
public void Print(byte[] buf)
{
Debug.Log(Bitconvert.ToString(buf));
}
```
C# 傳 byte[] 到 lua, 默認(rèn)為 "System.Byte[]"(userdata),可以用 tostring() 轉(zhuǎn)為 lua string:
```Lua
s = tolua.tolstring(result)
```
如果可以,應(yīng)該給數(shù)據(jù)加上標(biāo)簽[LuaByteBufferAttribute],這樣傳到 lua 就是 string。
或者在C#建一個LuaByteBuffer把byte[]傳給lua。
(金慶的專欄 2020.8)
lua中不區(qū)分 string 和 byte[], 而在 C# 中 string 和 byte[] 之間轉(zhuǎn)換涉及編碼。
C# 中一般這樣轉(zhuǎn):
string類型轉(zhuǎn)成byte[]:
```
byte[] byteArray = System.Text.Encoding.Default.GetBytes(str);
```
byte[]轉(zhuǎn)成string:
```
string str = System.Text.Encoding.Default.GetString(byteArray);
```
Default 編碼是本機當(dāng)前所用編碼,還可以用 ASCII, UTF8 等其他編碼。
測了在 lua 中讀入一塊2進(jìn)制數(shù)據(jù),調(diào)用 tolua 導(dǎo)出的一個方法,如:
```
public void Print(string s)
{
byte[] buf = Systen.Text.Encoding.Default.GetBytes(s);
Debug.Log(Bitconvert.ToString(buf));
}
```
測了 Default, ASCII, UTF8, ISO-8859-1(Latin-1), Unicode 發(fā)現(xiàn)得到的 byte[] 會出錯。
也試了 [C#中使用Buffer.BlockCopy()方法將string轉(zhuǎn)換為byte array的方法](https://www.cnblogs.com/ChineseMoonGod/p/5689526.html)
發(fā)現(xiàn) tolua 傳到 C# 的 string 已經(jīng)是編碼過的,直接復(fù)制也是錯的。
xlua 也有相同問題,[Unity xlua 從lua傳遞byte[]數(shù)據(jù)到C#](https://www.jianshu.com/p/63987134c1ba)
使用 MemoryStream對象來傳遞byte[]數(shù)據(jù),確實有點繞。
tolua 中有個 LuaByteBuffer,可以用來傳遞 byte[].
[tolua#中的LuaByteBuffer類](http://bbs.ulua.org/article/ulua/toluazhongdeluabytebufferlei.html)
從 lua 傳 byte[] 到 C#, 只需要將參數(shù) 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));
}
```
最終發(fā)現(xiàn)不需要 LuaByteBufferAttribute,直接用 byte[] 就行:
```
public void Print(byte[] buf)
{
Debug.Log(Bitconvert.ToString(buf));
}
```
C# 傳 byte[] 到 lua, 默認(rèn)為 "System.Byte[]"(userdata),可以用 tostring() 轉(zhuǎn)為 lua string:
```Lua
s = tolua.tolstring(result)
```
如果可以,應(yīng)該給數(shù)據(jù)加上標(biāo)簽[LuaByteBufferAttribute],這樣傳到 lua 就是 string。
或者在C#建一個LuaByteBuffer把byte[]傳給lua。


