You also have Erlang’s pattern matching at your disposal:
decode(<<16#01, Size:8, Payload:Size/binary-unit:8, Rest/binary>>) ->
[{field1, Payload}|decode(Rest)];
decode(<<16#02, Flags:16, Rest/binary>>) when Flags =:= 1 ->
[{field2, true}|decode(Rest)];
decode(<<16#02, Flags:16, Rest/binary>>) ->
[{field2, false}|decode(Rest)].
Anything after the when keyword is a guard condition allowing for some manner of positive/negative “look ahead” (Contrived example, but maybe you get the point).