我正在尝试用更优雅的东西替换以下函数:
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>>]
带有列表推导的优雅解决方案将是更可取的,因为此结果将使用列表推导进一步处理,然后可以将其包装在一个推导中。
我试过
[ 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>>]