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库。
感谢任何帮助。提前谢谢。
答案 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表示无符号字节,而>表示字节顺序(大字节序)。