在lua中将字节数组转换为double

时间:2012-02-15 23:50:58

标签: java lua redis bit-manipulation

Redis(键值存储)支持lua脚本 - 它在服务器上执行脚本。我正在使用Java客户端与Redis进行交互。我将一个字节数组传递给lua,在lua中,我必须将其转换为int或string。

以下是java代码段

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

args是byte []

类型的ArrayList

以下是我试过的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()返回一个nil(这是我得到的错误,因为我将它乘以2)

无论如何我们可以在lua中将这个字节数组转换为double(1.5)的double或string表示形式?请注意,我们不能在redis脚本中使用任何外部lua库。

感谢任何帮助。提前谢谢。

3 个答案:

答案 0 :(得分:5)

Lua不是一种低级语言。它不知道如何处理字节数组。

理论上,你可以写一个二进制到双重的解码器(虽然这很难,因为Lua 5.1没有任何位操作的东西)。但是你花时间尝试传递Lua所理解的Lua数据的时间会更好。 Lua可以将字符串转换为数字,因此您可以向Lua传递该数字的字符串表示。

在Lua之外清理您的数据。

答案 1 :(得分:0)

Nicol说的是真的。如果将double作为字符串传递:"1.5",则在脚本中解析它就像这样简单:

tonumber(table.remove(ARGV))

答案 2 :(得分:0)

一段时间后,我遇到了同样的问题并找到了解决方案,互联网上没有太多与此相关的信息,我想更新此线程

redis.call('zadd', KEYS[1], struct.unpack('>L', ARGV[1]), ARGV[2]);

您可以使用结构库将byte []转换为Long,L表示无符号字节,而>表示字节顺序(大字节序)。

有关更多信息,[[https://github.com/iryont/lua-struct]