1

例如,我通过 jedis 将元组 T = {k1, v1, k2, v2} 保存到 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 术语呢?


二郎端:

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").

查看可用的编码文档。

这是一个关于 SO的链接,它显示了如何将字符串转换为 ASCII 字节数组。

于 2013-10-14T21:16:54.957 回答