私はgen_fsmの2つのバージョンを書いて、バイトストリームを解析しました。私は文字列snp
で始まり、p
の後に次の20バイトを保存するパケットを探しています。このコードはヘッダーの検索にのみ関係します。私は、より慣用的なErlangまたはそれを書く良い方法について、いくつかのアドバイスが必要です。どちらがもっと慣用ですか?
オプション1
parse_header({parse, Byte}, {Header, [Next | Rest]}) ->
case Byte of
Next when length(Rest) > 0 -> {next_state, parse_header, {Header, Rest}};
Next when length(Rest) == 0 -> {next_state, parse_data, []};
$s -> parse_header({parse, Byte}, {Header, Header});
_ -> {next_state, parse_header, {Header, Header}}
end.
オプション2
parse_start({parse, Byte}, State) when Byte == $s ->
{next_state, parse_new, State};
parse_start({parse, Byte}, State) when Byte /= $s ->
{next_state, parse_start, State}.
parse_new({parse, Byte}, State) when Byte == $n ->
{next_state, parse_packet, State};
parse_new({parse, Byte}, State) when Byte == $s ->
parse_start({parse, Byte}, State);
parse_new({parse, _Byte}, State) ->
{next_state, parse_start, State}.
parse_packet({parse, Byte}, State) when Byte == $p ->
{next_state, parse_data, State};
parse_packet({parse, Byte}, State) when Byte == $s ->
parse_start({parse, Byte}, State);
parse_packet({parse, _Byte}, State) ->
{next_state, parse_start, State}.