Почему `erl_decode` возвращает NULL при десериализации карты Elixir? - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь переместить некоторые данные между программой Elixir и программой C. В Elixir у меня есть структура вещей, которую я хочу перенести. Я использую :erlang.term_to_binary, чтобы преобразовать его в двоичный файл, который затем я sh превращаю в C.

Однако, когда я декодирую его, он просто возвращает NULL ?? И там нет сообщения об ошибке или что-нибудь. Куча других терминов эликсир / эрланг работает нормально; в частности, происходит сбой, когда я пытаюсь отправить по карте или структуре (это тип карты).

Я делаю что-то подобное в Elixir:

  msg = %Message{ title: "hello", body: "world" }
  binmsg = :erlang.term_to_binary(msg)
  send(state.port, {self(), {:command, binmsg}})

.. и в C (исключая получение сообщения, которое, как я подтвердил, пришло с правильной длиной, и даже подтвердило, что байты идентичны в C и эликсире):

  uint8_t *buf = read_cmd();
  ETERM *map = erl_decode(buf);
  erl_print_term(map, stdout);

1 Ответ

6 голосов
/ 14 марта 2020

Кажется из исходного кода erl_decode , что он не поддерживает десериализацию карт. Карты определены в двоичном протоколе Эрланга на Erlang / OTP 17, но в erl_marshal.c.

нет упоминания о MAP_EXT. устарела с Erlang / OTP 22. Вместо этого используйте семейство функций ei_decode_*! Там даже ei_decode_map_header. Это должно сработать.

...