我正在编写代码来解码来自二进制协议的消息。每个消息类型都分配有一个 1 字节的类型标识符,并且每个消息都带有这个类型 id。消息都以由 5 个字段组成的公共标头开始。我的 API 很简单:
decoder:decode(Bin :: binary()) -> my_message_type() | {error, binary()}`
我的第一直觉是通过为每种消息类型编写一个解码函数并在 fun 参数中完全解码该消息类型来大量依赖模式匹配
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_X:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeXField1:32, TypeXFld2:32, TypeXFld3:32>>) ->
#message_x{hdr1=Hdr1, hdr3=Hdr3 ... fld4=TypeXFld3};
decode(<<Hdr1:8, ?MESSAGE_TYPE_ID_Y:8, Hdr3:8, Hdr4:8, Hdr5:32,
TypeYField1:32, TypeYFld2:16, TypeYFld3:4, TypeYFld4:32
TypeYFld5:64>>) ->
#message_y{hdr1=Hdr1, hdr3=Hdr3 ... fld5=TypeYFld5}.
请注意,虽然消息的前 5 个字段在结构上是相同的,但之后的字段因每种消息类型而异。
我有大约 20 种消息类型,因此有 20 个与上述类似的功能。我是否使用这种结构多次解码完整消息?是地道的吗?我最好只解码函数头中的消息类型字段,然后解码消息正文中的完整消息吗?