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, UTF8 等其他编码。

测了在 lua 中读入一块2进制数据,调用 tolua 导出的一个方法,如:

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 发现得到的 byte[] 会出错。

也试了 C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法
发现 tolua 传到 C# 的 string 已经是编码过的,直接复制也是错的。

xlua 也有相同问题,Unity xlua 从lua传递byte[]数据到C#
使用 MemoryStream对象来传递byte[]数据,确实有点绕。

tolua 中有个 LuaByteBuffer,可以用来传递 byte[].
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。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XLua可以在Unity中实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity中。 2. 在Unity中创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码中使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子中,`Awake()`方法中创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法中每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法中释放了Lua环境。需要注意的是,在实际的项目中,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本中使用XLua提供的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子中,导出了一个名为`module`的Lua模块,并定义了其中的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提供了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#与Lua交的机制,以便更好地使用XLua。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值