如何在Erlang中对二进制文件进行模式匹配?

时间:2013-01-21 20:23:48

标签: binary erlang pattern-matching

我想对二进制文件进行递归,并且在每次调用中从二进制文件中读取最多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)

我对二进制模式匹配有什么问题?

2 个答案:

答案 0 :(得分:8)

模式<<H:32/binary, T/binary>>匹配包含至少32个字节的二进制,将前32个字节分配给H,将剩余字节分配给T.模式<<>>匹配空二进制。这些是你唯一的模式。

<<"JonasPonas">>既不是空的也不至少有32个字节。因此,它与您的任何一种模式都不匹配,并且您会收到错误。

要修复此问题,请添加一个处理少于32个字节的二进制文件的模式(您也可以删除空模式,因为它将是多余的)。

答案 1 :(得分: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>>).