2014-11-25 111 views
3

我目前正在使用Erlang作为一个大项目,但我有一个关于正确的过程的问题。Erlang二进制协议序列化

我通过tcp套接字接收字节。字节是根据固定的协议,发件人是一个pyton客户端。 python客户端使用类继承来创建对象的字节。

现在我想(在Erlang中)获取字节并将它们转换为等价消息,它们都有一个公共消息头。

我怎样才能做到这一点尽可能通用在Erlang?

此致使用Erlang的二进制语法

回答

2

模式匹配/二进制标头消耗。但是您需要知道您希望接收哪些字节或位,或者字节或位的字段大小。

例如,假设您期待的字符串将以ASCII字符串“PUSH”或“PULL”的等同字符开头,后面跟着一些您将放置在某处的其他数据。您可以创建相匹配的函数头,并捕获其余转嫁到,做“推()”或“拉()”的基础上字节的报头的功能:

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). 

在这种情况下,“_”变量的运行它总是 - 你只是检查领先,基本上偷看缓冲并通过全基于最初内容的东西。

你也可以跳过它。假设你知道你会接受一个二进制文件与前4个字节的绒毛,6个字节的数据类型,然后你想传递的休息:

filter_thingy(<<_:4/binary, Type:6/binary, Rest/binary>>) -> 
    % Do stuff with Rest based on Type... 

它变得非常自然的分裂二进制函数头文件(不管数据是否与字符串相同),让“休息”落在适当的功能上。如果您收到的Python咸菜数据或类似的东西,你会想要写的分析例程以递归的方式,让每一个数据类型的结论,返回到顶部以确定下一个类型,累计树表示迄今为止读取的数据。

我只覆盖了上述8位字节,但也有纯粹的比特串的语法,它可以让你去尽量与比特和字节的杂草,因为你需要一样简单的语法。匹配在这里是一个真正的救星。

希望这个通知不是糊涂了。 Erlang中的二进制语法使得这是我用过的一般编程语言中最令人愉快的二进制解析环境。

http://www.erlang.org/doc/programming_examples/bit_syntax.html