【问题标题】:erlang interface to pythonpython的erlang接口
【发布时间】:2011-06-30 08:41:14
【问题描述】:

我一直在扩展 Armstrong 经典接口示例的 python 版本。当我交流字节时,一切正常。但是,我想交流长整数和浮点数。甚至(哦,不)字符串。这是我的代码: http://pastebin.com/epxgDmvu http://pastebin.com/rD7CWRkz

首先,我只知道如何发送字节。 erlang可以向它的接口发送其他任何东西吗?还是我必须将浮点数转换为字节列表,将其发送到 python,然后将其组装回 python 中的浮点数?

另外,如果我使用 'f' 格式打包,erlang 会将其识别为字节列表。有没有办法说服 erlang 将这些字节作为一个浮点数?如果没有,我在哪里可以找到如何将该 erlang 列表转换为 erlang 浮点数?

如果 erlang 只能通信字节,你如何建议我发送一个整数列表?如果我将整数转换为字节列表,那么我不能在一条消息中发送它们,因为接收者不知道一个整数在哪里结束,另一个从哪里开始,对吧?然后我应该一个一个地发送整数吗?

是的,我正在研究 ErlPort 和 py-interface 等,但我想从基础开始。

问候, dijxtra

【问题讨论】:

    标签: python erlang


    【解决方案1】:

    在低级别(从编程的角度来看),您总是通过不同的外部接口(管道、网络、文件...)仅发送/接收一堆字节,而与您使用的编程语言无关。例如,当您使用管道(您调用open_port/2)时,您会以字节流的形式发送/接收数据。

    要通过流发送任何有用的信息,您需要将其划分为通常命名为消息的块。消息格式定义了如何从字节流中提取消息。例如,使用Type-Length-Value (TLV) encoding,您可以发送不同长度的值并标有类型。

    ErlPort 中,它的工作原理如下:

    • 当您调用open_port/2 时,您必须添加选项{packet, N},以便通过此端口发送的所有二进制消息都以它们的长度开头,以N 字节发送(长度-值编码)。
    • 在向端口发送术语之前,您必须使用 term_to_binary/1 函数,该函数使用 Erlang external term format 将 Erlang 术语编码为一堆字节。
    • 在 Python 端,当您实例化 erlproto.Port 类时,您必须传递与传递给 open_port/2 相同的 packet 值(默认为 packet=1)。
    • Port.read 方法首先从流中读取消息的长度,然后是消息体。
    • erlterms.decode 函数解码的消息正文。
    • 当您使用Port.write 方法发送回复时,它首先由erlterms.encode 函数编码为Erlang external term format
    • 然后将前面加上其长度的编码块发送回 Erlang。
    • 在 Erlang 端,binary_to_term/1 用于解码数据。

    【讨论】:

    • 所以,open_port/2 只有字节。嗯不错。我已经深入研究了 ErlPort,它是一个非常好的库。感谢您的解释。
    猜你喜欢
    • 2011-12-09
    • 2011-05-06
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2021-06-16
    相关资源
    最近更新 更多