Как прочитать термин Erlang из Redis с помощью Java-клиента?

Например, я сохраняю кортеж T = {k1, v1, k2, v2} в redis с помощью jedis:

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

Но когда термин более сложный, например, для записи со списком внутри, он не будет работать. Потому что некоторые другие символы будут появляться не только в начале данных, но также в конце и в середине.

Почему сохраненные данные отличаются от полученных?

1 ответ

Отрицательные числа в начале байтового массива не являются допустимыми значениями для синтаксиса внешнего термина erlang.

Я бы предположил, что, поскольку вы в течение некоторого времени хранили термины эрланга в redis таким образом, вы вставляете их правильно.

Это действительно оставляет только одно: когда вы звоните getBytes() ваша кодировка отключена, скорее всего, она использует любую кодировку, установленную по умолчанию в вашей системе (вероятно, UTF-8, но я не уверен). На самом деле, что вы хотите сделать, это передать другую кодировку getBytes(), вероятно, так: getBytes("US-ASCII"),

Проверьте документацию для кодировки доступны.

Вот ссылка на SO, которая показывает, как преобразовать строку в байтовый массив ASCII.

Другие вопросы по тегам