二进制位的参数匹配

时间:2012-04-17 12:07:32

标签: erlang

我遇到了在二进制文件中匹配可变位数的问题,我将其缩小到以下玩具示例以提取二进制文件的前几位:

f(<<H:Bits, _/binary>>, Bits) ->
    H.

编译器(R15B01)告诉我variable 'Bits' is unbound。另一方面,这很好用:

f(X, Bits) ->
    <<H:Bits, _/binary>> = X,
    H.

它符合我的预期,例如f(<<1,2,3,4>>, 8)产生1,f(<<1,2,3,4>>, 16)产生258。

为什么第一种表格不起作用?它应该不等同吗?

1 个答案:

答案 0 :(得分:4)

在你的第一个例子f(<<H:Bits, _/binary>>, Bits) -> H中,变量Bits先前没有绑定 - 它同时出现在第一个和第二个参数模式中,但它们没有按任何特定顺序匹配,因此二进制文件中的位被认为是没有约束力。在第二个示例f(X, Bits) -> <<H:Bits, _/binary>> = X中,位在<<...>> = X的匹配开始之前就会被绑定。

第一个例子可以读作“取第二个参数中给出的位数并从二进制中提取多个位为H”(你想要的),但也可以读作“抓取一些任意数位的位从二进制为H的位(可能尽可能多),然后检查它是否与第二个参数中传递的数字相同“。为避免这种歧义,编译器拒绝该程序。