преобразование массива байтов в удвоение в lua - PullRequest
0 голосов
/ 16 февраля 2012

Redis (хранилище значений ключей) поддерживает сценарии lua - он выполняет сценарий на сервере. Я взаимодействую с Redis с помощью Java-клиента. Я передаю байтовый массив в lua, а в lua мне нужно преобразовать его в int или строку.

Ниже приведен фрагмент кода Java

byte[] exclScore = ByteBuffer.allocate(8).putDouble(1.5).array();
args.add(exclScore);

args - это ArrayList типа byte []

Ниже приведен скрипт lua, который я пробовал

byteScore = table.remove(ARGV)
size = string.len(byteScore)
x = string.sub(byteScore,1,1)
local output = 0
for i = 1,size do
  bit = tonumber(string.sub(byteScore,i,1))
  val2 = bit * (2 ^ i)
  output = output + val2
end
return output

ARGV - это таблица, которая получает все аргументы, отправленные Java-клиентом, а оценка - последняя запись. Я проверил тип (byteScore), и он оказался строковым. tonumber () возвращает ноль (это ошибка, которую я получаю, так как я умножаю ее на 2)

Есть ли в любом случае, когда мы можем преобразовать этот байтовый массив в двойное или строковое представление этого двойного (1.5) в lua? Обратите внимание, что мы не можем использовать внешние библиотеки lua внутри скриптов redis.

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

Lua не является языком низкого уровня. Он не знает, как обращаться с массивами байтов.

Теоретически, вы могли бы написать двоичный-двойной декодер (хотя это было бы сложно, так как в Lua 5.1 нет никаких манипуляций с битами). Но лучше было бы потратить ваше время на попытки передать данные Lua в форме, понятной Lua. Lua может преобразовывать строки в числа, поэтому вы можете передать Lua строковое представление этого числа.

Очистите ваши данные за пределами Lua.

0 голосов
/ 16 февраля 2012

То, что говорит Николь, правда.Если вы передаете ваш дубль в виде строки: "1.5", анализ его в вашем скрипте так же прост:

tonumber(table.remove(ARGV))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...