ERLANG - 将列表拆分为子列表

2024-01-17

嗨,这是我在这里的第一篇文章,希望你们一切都好。所以我刚刚开始 erlang,我遇到了一个问题,我还不知道如何解决。

所以我收到的二进制文件格式为

<<56, 23, 67, 34, 45, 78, 01, 54, 67, 87, 45, 53, 01, 34, 56, 78>>

我的目标是根据 01 将其拆分为子列表(如果更有效,则为二进制列表)。

例如,上面的结果应该是这样的:

<<56, 23, 67, 34, 45, 78>> <<54, 67, 87, 45, 53>> <<34, 56, 78>>

-or-

[[56, 23, 67, 34, 45, 78], [54, 67, 87, 45, 53], [34, 56, 78]]

01 是分隔标记,不需要包含在最终输出中。

我已经尝试过这样的事情:(如果有更好的方法请忽略)

parse1([]) -> [];
parse1(1) -> io:format("SOHSOHSOHSOHSOHSSOHSOHS");
parse1(Reply) -> parse1({Reply, []});
parse1({Reply, nxtParse}) ->
    [H | T] = Reply,
    case H of
         _ when H > 1 ->
            [H | nxtParse],
              io:format("Reply 1 = ~p~n", [H]),
            parse1({T, nxtParse});
         _ when H == 1 -> 
            io:format("SOHSOHSOHSOHSOHSSOHSOHS");

        [] ->
            ok

    end.

这根本不是很干净,也根本不像专业人士写的那样。我敢肯定,当有人暗示我时,我会“呃”地拍拍我的头。

我意识到肯定有不止一种解决方案,但最好的解决方案是什么。看来 ERL 有这么多 BIF 和做事方式,我想我只能找到我的方法了。

感谢大家的帮助 -B


与 R14A 一起,Erlang 现在包含一个binary http://erldocs.com/R14A/stdlib/binary.html处理此类任务的模块:

1> Bin = <<56, 23, 67, 34, 45, 78, 01, 54, 67, 87, 45, 53, 01, 34, 56, 78>>.
<<56,23,67,34,45,78,1,54,67,87,45,53,1,34,56,78>>
2> binary:split(Bin, <<01>>, [global]).
[<<56,23,67,34,45,78>>,<<"6CW-5">>,<<"\"8N">>]

请注意,虽然它看起来是错误的(<<"6CW-5">> and <<"\"8N">>),底层表示是正确的,字符串是虚拟机试图弄清楚如何打印出二进制文件。以原始格式输出时请参阅相同的调用:

3> io:format("~w~n", [binary:split(Bin, <<01>>, [global])]).
[<<56,23,67,34,45,78>>,<<54,67,87,45,53>>,<<34,56,78>>]
ok
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ERLANG - 将列表拆分为子列表 的相关文章

随机推荐