Erlang интерфейс для Python - PullRequest
       3

Erlang интерфейс для Python

7 голосов
/ 19 февраля 2011

Я расширил классическую версию интерфейсов Армстронга на python.Все отлично работает, пока я общаюсь байтами.Но я хотел бы общаться с длинными целыми числами и числами с плавающей запятой.Mabye четные (о, нет) строки.Вот мой код: http://pastebin.com/epxgDmvu http://pastebin.com/rD7CWRkz

Прежде всего, все, что я знаю, как отправить, это байты.Может ли Erlang отправить что-нибудь еще в свой интерфейс?Или мне нужно преобразовать float в список байтов, отправить его в python и затем собрать его обратно в float в python?

И наоборот: если я упаковываю в формате 'f', erlang распознаетэто как список байтов.Есть ли способ убедить Эрланга взять эти байты в качестве единого числа?Если нет, где я могу узнать, как преобразовать этот список erlang в число с плавающей запятой erlang?

Если erlang может передавать только байты, как вы предлагаете мне отправить список целых чисел?Если я преобразую целые числа в списки байтов, то я не смогу отправить их в одном сообщении, так как получатель не будет знать, где заканчивается одно целое число и начинается другое, верно?Должен ли я затем отправлять целые числа одно за другим?

Да, я изучаю ErlPort, py-interface и некоторые другие, но я бы хотел начать с основ.

С уважением, dijxtra

1 Ответ

5 голосов
/ 19 февраля 2011

На низком (с точки зрения программирования) уровне вы всегда отправляете / получаете только несколько байтов через разные внешние интерфейсы (каналы, сеть, файлы ...) независимо от используемого вами языка программирования. Например, когда вы работаете с каналами (которые вы называете open_port / 2 ), вы отправляете / получаете данные в виде потока байтов.

Чтобы отправить любую полезную информацию через поток, вам нужно разделить ее на порции, которые обычно называют сообщениями. Формат сообщения определяет, как сообщения могут быть извлечены из потока байтов. Например, используя кодировку Type-Length-Value (TLV) , вы можете отправлять значения различной длины, помеченные типом.

В ErlPort все работает следующим образом:

  • Когда вы вызываете open_port / 2 , вы должны добавить опцию {packet, N}, чтобы всем двоичным сообщениям, отправляемым через этот порт, предшествовала их длина, отправляемая в N байтах (кодирование длины-значения).
  • Перед отправкой термина в порт вы должны использовать функцию term_to_binary / 1 , которая кодирует термин Эрланга в группу байтов, используя Формат внешнего термина Эрланга .
  • На стороне Python при создании экземпляра класса erlproto.Port вы должны передать то же значение packet, что и при передаче open_port / 2 (packet=1 по умолчанию).
  • Метод Port.read сначала считывает длину сообщения из потока, а затем тело сообщения.
  • Тело сообщения, декодированное с помощью функции erlterms.decode .
  • Когда вы отправляете ответ, используя метод Port.write , он сначала кодируется в Формат внешнего термина Erlang с помощью erlterms.encode function.
  • Затем закодированный кусок, которому предшествует его длина, отправляется обратно в Erlang.
  • На стороне Erlang binary_to_term / 1 используется для декодирования данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...