2011-08-23 164 views
3

我试图将一个Lua表转换为一个C#字节数组。我能得到一个转换为双阵列工作方式如下:将表转换为字节数组

> 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_arrByte阵列(dbl_arr = Byte[4]),然后我得到了以下错误:(error object is not a string)

我我试了一堆不同的东西,但没有运气。任何帮助,将不胜感激。

更新:

我能够这样做是为了得到错误更多的信息:

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

现在suc是假的,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专业版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 
+0

哪里'dbl_arr'从何而来? –

+0

@Nicol - 它只是我创建的Double数组:'dbl_arr = Double [4]' – SwDevMan81

+0

不够公平。我的意思是'Double [4]'来自哪里。它是否使用某种metatable来使用[]创建对象? –

回答

0

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

这是解决方法。我基本上创建一个MemoryStream并使用WriteByte函数强制值为一个字节(因为没有函数的重载,它只接受一个字节)。然后,我打电话ToArray得到来自MemoryStreambyte[]

> 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 
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字节。

+0

这就是回应,我应该提到运行for循环尝试和'SetValue'时发生错误。它会打印所有0的罚款,但是当我尝试做'dbl_arr:SetValue(0,4)'之类的东西时,我得到了'(错误对象不是字符串)'消息 – SwDevMan81

+0

ok - 请参阅上面的编辑 – Yahia

+0

是的,不幸的是没有一种方法可以施放。我试着做'Convert.ToByte(4)'并将其传入,但仍然失败。我有一种感觉,它将中间结果存储为Lua'数字',然后自动将它转换为C#'Double'。这是我可以根据这个错误提出的唯一解释。 – SwDevMan81