将表格转换为字节数组。

我试图将 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_arr更改为字节数组(dbl_arr = Byte[4]),那么我会得到以下错误:``(错误对象不是字符串)`

我尝试了很多不同的方法都没有成功。任何帮助将不胜感激。

更新:

我通过执行以下操作获得了更多的错误信息:

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)

我从这里安装了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 <-- 错误出现在此处

原文链接 https://stackoverflow.com/questions/7167229

点赞
stackoverflow用户847363
stackoverflow用户847363

我怀疑此问题的原因是 Console.WriteLine 没有接收 Byte 参数的重载方法。

我对 Lua 的了解不够,但在 C# 中,我会调用 GetValue(i).ToString()Convert.ToString(GetValue(i), 16),并将其结果传递给 Console.WriteLine 函数。

编辑-如注释所述:

然后,您需要将其转换为 Byte - 在 C# 中,我会做类似 dbl_arr:SetValue((Byte)0,4)dbl_arr:SetValue((Byte)v,4) 的操作。在 Lua 中,我不知道该如何实现。

编辑2-如注释所述:

double 是 8 个字节,而 Single/float 是 4 个字节。

2011-08-24 04:57:01
stackoverflow用户95573
stackoverflow用户95573

我找到了解决这个问题的方法。尽管我仍然好奇为什么上面的方法不起作用,但是我会在这里发布这个方法。

这是解决方法。我基本上创建了一个MemoryStream,使用WriteByte函数强制将值转换为Byte(因为该函数没有重载部分,它只接受一个字节)。然后我调用ToArrayMemoryStream中获取byte[]

> 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-06 17:00:26