最近在使用xlua protobuf开发项目。
在lua中是没有byte[]类型的,lua里的byte[]与string是通用的,有点像python2里的字节流。从C#端传递一个byte[]或者string对象到Lua都会自动变成string类型对象,从lua传递一个string到C#还是string类型。
最开始我的做法是将protobuf消息当作一个string传递给C#,到了C#端再通过Encoding.UTF8.GetBytes(str)将数据转换成byte[],然后发现通过这种方法开成的byte[]有时候会出现数据错乱,再将C#中的byte[]传给lua发现无法通过protobuf解析。
尝试了各种方法之后,发现可以通过MemoryStream对象来传递byte[]数据,虽然有点绕,能不报错就万幸了。
参考代码如下
- LUA代码获取MemoryStream对象,以及数据长度
function bytes_to_mm(bytes)
mm = CS.System.IO.MemoryStream()
mm.Position = 0
mm:SetLength(0)
len = #bytes
mm:Write(bytes,0,len)
return mm, len
end
- C#代码得到MemorySteam对象,从中读取byte[]数据
void f(MemoryStream mm, int len)
{
byte[] bytes = new byte[len];
mm.Position = 0;
mm.Read(bytes, 0, len);
}