Erlang与Python的接口

8 投票
1 回答
2038 浏览
提问于 2025-04-16 12:07

我一直在扩展Python版本的阿姆斯特朗经典接口示例。用字节进行通信时一切都很好。但我想要传输长整型和浮点数,甚至(哦,不)字符串。以下是我的代码:http://pastebin.com/epxgDmvu http://pastebin.com/rD7CWRkz

首先,我知道的就是如何发送字节。Erlang能否发送其他类型的数据到它的接口?还是说我必须把浮点数转换成字节列表,发送到Python,然后再在Python中把它组装回浮点数?

反过来,如果我用'f'格式打包,Erlang会把它识别为字节列表。有没有办法让Erlang把这些字节当作一个单独的浮点数?如果不行,我该去哪里找出如何把Erlang列表转换成Erlang浮点数?

如果Erlang只能通信字节,那我该如何发送整数列表?如果我把整数转换成字节列表,那么我就不能在一条消息中发送它们,因为接收方不知道一个整数在哪里结束,另一个在哪里开始,对吧?那我是不是应该一个一个地发送整数?

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

问候,
dijxtra

1 个回答

5

从编程的角度来看,底层的操作其实就是通过各种外部接口(比如管道、网络、文件等)发送和接收一堆字节,而这和你使用的编程语言无关。例如,当你使用管道(通过调用 open_port/2)时,你发送和接收的数据都是以字节流的形式存在的。

为了通过这个字节流发送有用的信息,你需要把信息分成小块,通常叫做消息。消息的格式决定了如何从字节流中提取出这些消息。例如,使用 类型-长度-值(TLV)编码,你可以发送不同长度的值,并用类型来标记它们。

ErlPort 中,整个过程是这样的:

  • 当你调用 open_port/2 时,必须添加选项 {packet, N},这样通过这个端口发送的所有二进制消息前面都会加上它们的长度,这个长度用 N 个字节表示(长度-值编码)。
  • 在向端口发送数据之前,你需要使用 term_to_binary/1 函数,这个函数会把 Erlang 的数据转换成一堆字节,使用的是 Erlang 外部数据格式
  • 在 Python 端,当你实例化 erlproto.Port 类时,必须传入和 open_port/2 一样的 packet 值(默认是 packet=1)。
  • Port.read 方法首先从流中读取消息的长度,然后读取消息的内容。
  • 消息的内容会通过 erlterms.decode 函数进行解码。
  • 当你使用 Port.write 方法发送回复时,首先会通过 erlterms.encode 函数将其编码为 Erlang 外部数据格式
  • 然后,将编码后的数据块前面加上它的长度,再发送回 Erlang。
  • 在 Erlang 端,使用 binary_to_term/1 来解码这些数据。

撰写回答