次の関数をよりエレガントなものに置き換えようとしています:
split_packet(_, <<>>) ->
[];
split_packet(Size, P) when byte_size(P) < Size ->
[ P ];
split_packet(Size, P) ->
{Chunk, Rest} = split_binary(P, Size),
[ Chunk | split_packet(Size, Rest) ].
(私は今、これは末尾再帰ではありません -- シンプルに保ちたかったのですが、Erlang の新しいバージョンではパフォーマンスが問題にならないことに加えて)
出力例:
1> split_packet(3, <<1,2,3,4,5,6,7,8>>).
[<<1,2,3>>,<<4,5,6>>,<<7,8>>]
リスト内包表記を使用したエレガントなソリューションが望ましいでしょう。これは、この結果がリスト内包表記でさらに処理され、1 つの内包表記にラップできるためです。
私は試した
[ X || <<X:Size/binary>> <= P ].
ただし、Size が の倍数でない場合、これは最後のチャンクを除外しますbyte_site(P)
。
2> [ X || <<X:3/binary>> <= <<1,2,3,4,5,6,7,8>> ].
[<<1,2,3>>,<<4,5,6>>]