2

バイナリで再帰を行い、各呼び出しでバイナリから最大 32 ビットを読み取り、それを新しいバイナリで返したいと思います。しかし、パターン マッチングを思うように動作させることができません。

binaryToBinary(Source) ->
    binaryToBinaryAux(Source, <<>>).

binaryToBinaryAux(<<>>, Target) ->
    Target;
binaryToBinaryAux(<<H:32/binary, T/binary>>, Target) ->
    binaryToBinaryAux(<<T/binary>>, <<Target/binary, H>>).

パターンマッチングで得られるエラーは次のとおりです。

10> mymodule:binaryToBinary(<<"JonasPonas">>).
** exception error: no function clause matching
                    mymodule:binaryToBinaryAux(<<"JonasPonas">>,<<>>) 
                                                          (mymodule.erl, line 51)

バイナリのパターン マッチングで何が間違っていますか?

4

2 に答える 2

8

パターン<<H:32/binary, T/binary>>は、少なくとも 32 バイトを含むバイナリに一致し、最初の 32 バイトを H に割り当て、残りのバイトを T に割り当てます。パターン<<>>は空のバイナリに一致します。これらはあなたの唯一のパターンです。

<<"JonasPonas">>空でもなく、少なくとも 32 バイトもありません。したがって、どちらのパターンにも一致せず、エラーが発生します。

これを修正するには、32 バイト未満のバイナリを処理するパターンを追加します (空のパターンは冗長になるため、削除することもできます)。

于 2013-01-21T20:56:18.293 に答える
0

これは正しく機能するはずです:

binaryToBinary(Source) ->
    binaryToBinaryAux(Source, <<>>).

binaryToBinaryAux(<<>>, Target) ->
    Target;
binaryToBinaryAux(<<H:32/binary, T/binary>>, Target) ->
    binaryToBinaryAux(<<T/binary>>, <<Target/binary, H/binary>>);
binaryToBinaryAux(Rest, Target) ->
    binaryToBinaryAux(<<>>, <<Target/binary, Rest/binary>>).
于 2013-01-22T15:21:49.423 に答える