我目前正在使用Erlang进行大项目,但我对正确的程序有疑问。
我通过tcp套接字接收字节。字节是根据固定协议,发送者是pyton客户端。 python客户端使用类继承从对象创建字节。
现在我想(在Erlang中)获取字节并将这些字节转换为它们的equivelant消息,它们都有一个共同的消息头。
我如何在Erlang中尽可能通用?
亲切的问候,
我
答案 0 :(得分:2)
使用Erlang的二进制语法进行模式匹配/二进制头消费。但是,您需要确切地知道您希望接收的字节或位,或字段大小(字节或位)。
例如,让我们假设你期望一个字节串,它将以等同于ASCII字符串" PUSH"或者" PULL",然后是您将放置在某处的其他一些数据。你可以创建一个匹配它们的函数头,并捕获其余部分以传递给一个函数,该函数执行" push()"或"拉()"基于字节标题:
operation_type(<<"PUSH", Rest/binary>>) -> push(Rest);
operation_type(<<"PULL", Rest/binary>>) -> pull(Rest).
前四个字节后的字节现在位于Rest
,您可以自由解释依次保留的后续标题或数据。您也可以匹配整个二进制文件:
operation_type(Bin = <<"PUSH", _/binary>>) -> push(Bin);
operation_type(Bin = <<"PULL", _/binary>>) -> pull(Bin).
在这种情况下,&#34; _&#34;变量就像它一直工作一样 - 你只是只是检查线索,基本上是偷看缓冲区并根据初始内容传递整个事物。
你也可以跳过它。假设您知道您将收到前面有4个字节绒毛的二进制文件,6个字节的类型数据,然后是您要传递的其余内容:
filter_thingy(<<_:4/binary, Type:6/binary, Rest/binary>>) ->
% Do stuff with Rest based on Type...
在函数头中分割二进制文件变得非常自然(无论数据是否等同于字符串),让&#34; Rest&#34;随身携带适当的功能。如果您正在接收Python pickle数据或类似的东西,您可能希望以递归方式编写解析例程,以便每个数据类型的结论返回到顶部以确定下一个类型,其中累积树表示到目前为止读取的数据。
我只覆盖了上面的8位字节,但是还有一个纯粹的bittring语法,它允许您根据需要使用相同的语法,尽可能多地使用位和字节。匹配是一个真正的救星。
希望这更让人感到困惑。 Erlang中的二进制语法使得它成为我曾经遇到的通用编程语言中最令人愉快的二进制解析环境。
http://www.erlang.org/doc/programming_examples/bit_syntax.html