1

たとえば、タプル T = {k1, v1, k2, v2} を jedis で redis に保存します。

 eredis:q(Conn, ["SET", <<"mykey">>, term_to_binary(T)]).

以下のコードを使用して、この erlang 用語を読み取ろうとしています。

Jedis j =  Redis.pool.getResource();
byte[] t = j.get("mykey").getBytes();
OtpInputStream ois = new OtpInputStream(t);
System.out.println(OtpErlangObject.decode(ois));

エラー: com.ericsson.otp.erlang.OtpErlangDecodeException: 不明なデータ型: 239。

では、どうすれば erlang 用語を正しく取得できますか?


Erlang 側:

term_to_binary({k1, v1, k2, v2})。

<<131,104,4,100,0,2,107,49,100,0,2,118,49,100,0,2,107,50, 100,0,2,118,50>>

Java 側:

j.get("mykey").getBytes():

-17 -65 -67 104 4 100 0 2 107 49 100 0 2 118 49 100 0 2 107 50 100 0 2 118 50.

最初の 3 バイトだけが異なるようです。そこで、それらを byte(131) に変更すると、System.out.println(OtpErlangObject.decode(ois)) で正しく印刷できます。

ただし、リストが含まれるレコードなど、用語がより複雑な場合は機能しません。データの先頭だけでなく、末尾や途中にも他の文字が表示されるためです。

保存したデータが取得したデータと異なるのはなぜですか?

4

1 に答える 1

0

バイト配列の先頭にある負の数は、erlang 外部用語構文では有効な値ではありません。

しばらくの間、この方法で erlang 用語を redis に保存してきたので、それらを正しく挿入していると思います。

getBytes()エンコーディングがオフになっている場合、システムでデフォルトとして設定されているエンコーディングを使用している可能性が最も高いです(おそらくUTF-8ですが、よくわかりません)。本当にやりたいことはgetBytes()、おそらく次のように、別のエンコーディングを に渡すことですgetBytes("US-ASCII")

利用可能なエンコーディングのドキュメントを確認してください。

文字列を ASCII バイト配列に変換する方法を示すSO のリンクを次に示します。

于 2013-10-14T21:16:54.957 に答える