Преобразовать таблицу в байтовый массив - PullRequest
3 голосов
/ 24 августа 2011

Я пытаюсь преобразовать таблицу 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_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)

Я установил lua для Windows с здесь . Это версия 5.1.4-45. Я использую Microsoft Windows XP Professional Версия 2002 с пакетом обновления 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 голосов
/ 06 сентября 2011

Я нашел решение этой проблемы. Я опубликую это здесь, хотя мне все еще любопытно, почему вышеупомянутое не работает.

Вот обходной путь. Я в основном создаю MemoryStream и использую функцию WriteByte для принудительного перевода значения в байт (поскольку функция не перегружена, она принимает только байт). Затем я звоню 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
0 голосов
/ 24 августа 2011

Я подозреваю, что причина в том, что 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.

EDIT 2 - какза комментарий:double - это 8 байтов, Single/float - это 4 байта.

...