2012-02-15 13 views
0

Redis(キー値ストア)はluaスクリプトをサポートしています。これはサーバー上でスクリプトを実行します。私はJavaクライアントを使ってRedisと対話しています。私はバイト配列をluaとluaに渡していますが、それをintまたはstringに変換する必要があります。luaでバイト配列をdoubleに変換する

は、以下の型バイトの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コードスニペット

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

引数されるテーブルでありますJavaクライアントによって送信されたすべての引数を受け取り、スコアは最後のエントリです。私は型(byteScore)をチェックし、文字列であることが判明しました。私がこのバイト配列をluaのdouble(1.5)のdoubleまたはstring表現に変換することはできますか? redisスクリプト内では、外部のluaライブラリを使用することはできません。

何か助けていただければ幸いです。前もって感謝します。

答えて

5

Luaは低レベル言語ではありません。バイト配列を扱う方法は知られていません。

理論的には、バイナリからダブルへのデコーダを書くことができます(しかし、Lua 5.1にはビット操作のものがないので難しいでしょう)。しかし、あなたの時間は、Luaが理解できる形であるLuaデータを渡そうとした方が良いでしょう。 Luaは文字列を数値に変換できるので、その数値の文字列表現をLuaに渡すことができます。

データをLuaの外部でサニタイズします。

+0

(LUA外のデータを消毒)最良の選択肢であると考えられること。ありがとうございました。 – Raghava

0

Nicolが言っていることは本当です。あなたは文字列としてあなたのダブル合格した場合:"1.5"を、スクリプトの中で、それを解析するのと同じくらい簡単です:

tonumber(table.remove(ARGV)) 
+0

はい、そうです。しかし、私の他の引数はすべてバイト配列です。これは、doubleをバイト配列として送る理由です。このスコアを文字列に変換しなければならない場合は、残りの引数を文字列に変換して回避することを考えなければなりません。選択肢がないので、私はそれをするかもしれない。 – Raghava

+0

好奇心から、引数をバイト配列として送信する理由は何ですか? –

+0

Redisと対話するために私が使用するJavaクライアントは、データをRedisに渡すたびにすべての引数をバイト配列に変換します。この繰り返し変換の代わりに、私はそれを一度だけ行い、アプリケーション全体を通してデータをバイト配列として扱います。 – Raghava

関連する問題