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 回答