3

我正在尝试将 Lua 表转换为 C# 字节数组。我能够转换为 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_arrByte数组 ( dbl_arr = Byte[4]),则会收到以下错误:(error object is not a string)

我尝试了很多不同的事情,但没有运气。任何帮助,将不胜感激。

更新:

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

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

Nowsuc为 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)

我从这里安装了 luaforwindows 。它的版本是 5.1.4-45。我正在运行 Microsoft Windows XP Professional Version 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
4

2 回答 2

0

I found a workaround for this issue. I'll post it here, although I'm still curious why the above doesn't work.

Here is the workaround. I basically create a MemoryStream and use the WriteByte function to force the value to a Byte (since there is no overload of the function, it only accepts a byte). Then I call ToArray to get the byte[] from the 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
于 2011-09-06T17:00:26.737 回答
0

我怀疑原因是它Console.WriteLine没有需要Byte.

我对 Lua 的了解不够 - 在 C# 中我会调用GetValue(i).ToString() orConvert.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 个字节。

于 2011-08-24T04:57:01.550 回答