将表转换为Byte数组

时间:2011-08-23 20:36:39

标签: .net arrays lua luainterface clrpackage

我正在尝试将Lua表转换为C#Byte数组。我能够转换为Double数组,如下所示:

> require 'CLRPackage'
> import "System"
> tbl = {11,22,33,44}
> dbl_arr = Double[4]
> dbl_arr:GetValue(0)
> dbl_arr:GetValue(1)
> for i=0,3 do Console.WriteLine(dbl_arr:GetValue(i)) end
0
0
0
0
> for i,v in ipairs(tbl) do dbl_arr:SetValue(v,i-1) end
> for i=0,3 do Console.WriteLine(dbl_arr:GetValue(i)) end
11
22
33
44
>

但是,如果我将dbl_arr更改为Byte数组(dbl_arr = Byte[4]),则会收到以下错误:(error object is not a string)

我尝试过一堆不同的东西而没有运气。任何帮助将不胜感激。

更新

通过这样做,我能够从错误中获得更多信息:

suc,err = pcall(function() byte_arr:SetValue(12,0) end)

现在suc为false,err返回以下消息:

SetValue failed
System.ArgumentException: Cannot widen from source type to target type either
   because the source type is a not a primitive type or the conversion cannot
   be accomplished.
at System.Array.InternalSetValue(Void* target, Object value)
at System.Array.SetValue(Object value, Int32 index)

我从here安装了luaforwindows。它的版本是5.1.4-45。我正在运行Microsoft Windows XP Professional 2002 Service Pack 3

更新

这是示例代码,并且发生错误

> require 'CLRPackage'
> import "System"
> tbl = {11,22,33,44}
> dbl_arr = Byte[4]
> for i,v in ipairs(tbl) do dbl_arr:SetValue(v,i-1) end <-- Error occurs here

2 个答案:

答案 0 :(得分:0)

我怀疑原因是Console.WriteLine没有带Byte的重载。

我对Lua不太了解 - 在C#中我会拨打GetValue(i).ToString()Convert.ToString(GetValue(i), 16)并将该调用的结果提供给Console.WriteLine

编辑 - 根据评论:

然后你需要转换为字节 - 在C#中我会做类似dbl_arr:SetValue((Byte)0,4)dbl_arr:SetValue((Byte)v,4)的事情 - 我不知道这是怎么做的Lua。

编辑2 - 根据评论:
double为8个字节,Single/float为4个字节。

答案 1 :(得分:0)

我找到了解决此问题的方法。我会在这里发布,虽然我仍然很好奇为什么以上不起作用。

这是解决方法。我基本上创建了一个MemoryStream并使用WriteByte函数将值强制为Byte(因为函数没有重载,它只接受一个字节)。然后,我致电ToArray以获取byte[]

中的MemoryStream
> require 'CLRPackage'
> import "System"
> tbl = {11,22,33,44}
> mem_stream = MemoryStream()
> for i,v in ipairs(tbl) do mem_stream:WriteByte(v) end
> byte_arr = mem_stream:ToArray()
> for i=0,byte_arr.Length-1 do Console.WriteLine(string.format("%d", byte_arr:GetValue(i))) end
11
22
33
44