2012-02-15 66 views
0

Redis(鍵值存儲)支持lua腳本 - 它在服務器上執行腳本。我正在使用java客戶端與Redis進行交互。我將一個字節數組傳遞給lua和lua,我將不得不將其轉換爲int或字符串。在lua中將字節數組轉換爲雙重

以下是java代碼段

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

argS對類型字節的ArrayList []

以下是,我試圖

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的LUA腳本是表它接收java客戶端發送的所有參數,分數是最後一個條目。我檢查了類型(byteScore),結果是字符串。 tonumber()返回一個零(這是我得到的錯誤,因爲我把它乘以2)

是否有無論如何我們可以將該字節數組轉換爲雙倍或字符串表示形式的雙(1.5)在lua?請注意,我們不能在redis腳本中使用任何外部lua庫。

任何幫助表示讚賞。提前致謝。

回答

5

Lua不是低級語言。它不知道如何處理字節數組。從理論上講,你可以寫一個二進制到雙解碼器(雖然這很難,因爲Lua 5.1沒有任何位操作的東西)。但是你的時間會花在嘗試傳遞Lua理解的Lua數據上。 Lua可以將字符串轉換爲數字,因此您可以將Lua傳遞給該數字的字符串表示形式。

在Lua之外清理數據。

+0

這似乎是最好的選擇(LUA外消毒數據)。謝謝。 – Raghava 2012-02-16 23:40:29

0

尼科爾說的是真的。如果你通過雙作爲一個字符串:"1.5",在你的腳本解析很簡單:

tonumber(table.remove(ARGV)) 
+0

是的,那是真的。但是,我所有其他的參數都是字節數組,這就是我將double作爲字節數組發送的原因。如果我必須將這個分數轉換爲一個字符串,那麼我需要將其餘的參數轉換爲我認爲可以避免的字符串。由於沒有選擇,我可能會這樣做。 – Raghava 2012-02-16 02:05:48

+0

出於好奇,你將參數作爲字節數組發送的原因是什麼? – 2012-02-16 09:39:00

+0

我用來與Redis進行交互的java客戶端在每次將數據傳遞給Redis時將所有參數轉換爲字節數組。而不是這種重複的轉換,我只做一次,並通過我的應用程序將數據作爲字節數組處理。 – Raghava 2012-02-17 18:04:30