Nav*_*les 5 binary erlang serialization protocols
我目前正在使用 Erlang 进行一个大项目,但我有一个关于正确处理的问题。
我通过 TCP 套接字接收字节。字节按照固定协议发送,发送者是 pyton 客户端。python 客户端使用类继承从对象创建字节。
现在我想(在 Erlang 中)获取字节并将它们转换为等效的消息,它们都有一个共同的消息头。
我怎样才能在 Erlang 中尽可能通用地做到这一点?
亲切的问候,
我
使用 Erlang 的二进制语法进行模式匹配/二进制标头消耗。但是您需要确切地知道您期望接收哪些字节或位,或者以字节或位为单位的字段大小。
例如,假设您需要一个字节字符串,该字符串将以相当于 ASCII 字符串“PUSH”或“PULL”开头,后跟您将放置在某处的其他一些数据。您可以创建一个与这些匹配的函数头,并捕获其余部分以传递给基于字节头执行“push()”或“pull()”的函数:
operation_type(<<"PUSH", Rest/binary>>) -> push(Rest);
operation_type(<<"PULL", Rest/binary>>) -> pull(Rest).
Run Code Online (Sandbox Code Playgroud)
前四个字节之后的字节现在将位于 中Rest,让您可以自由地解释依次保留的任何后续标头或数据。您还可以匹配整个二进制文件:
operation_type(Bin = <<"PUSH", _/binary>>) -> push(Bin);
operation_type(Bin = <<"PULL", _/binary>>) -> pull(Bin).
Run Code Online (Sandbox Code Playgroud)
在这种情况下,“_”变量的工作方式与往常一样——您只是检查线索,本质上是查看缓冲区并根据初始内容传递整个内容。
您也可以在其中跳过。假设您知道您将收到一个二进制文件,其中前面有 4 个字节的绒毛,6 个字节的类型数据,然后是您想要传递的其余部分:
filter_thingy(<<_:4/binary, Type:6/binary, Rest/binary>>) ->
% Do stuff with Rest based on Type...
Run Code Online (Sandbox Code Playgroud)
在函数头中分割二进制文件变得非常自然(无论数据是否等于字符串),让“其余”在您进行过程中落到适当的函数中。如果您正在接收 Python pickle 数据或类似的数据,您可能希望以递归方式编写解析例程,以便每种数据类型的结论返回到顶部以确定下一个类型,并使用表示该数据类型的累积树来确定下一个类型。到目前为止读取的数据。
上面我只介绍了 8 位字节,但还有一种纯位字符串语法,它可以让您以同样简单的语法深入了解所需的位和字节。匹配在这里是一个真正的救星。
希望这能提供更多信息,而不是造成困惑。Erlang 中的二进制语法使其成为我遇到过的通用编程语言中最令人愉快的二进制解析环境。
http://www.erlang.org/doc/programming_examples/bit_syntax.html
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |