空二进制列表与模式匹配

时间:2011-11-07 05:49:52

标签: erlang

我正在尝试解析二进制文件,当涉及将以小端包装的数字返回到16位时,我希望这可以工作:

foo(Bin, Bits) when is_binary(Bin) ->
    <<A, B, C, D, _Rest>> = Bin,
    (bar(<<A, B>>, Bits) =/= 0) and (bar(<<C, D>>, Bits) =/= 0).

bar(<<N:16/little-unsigned-integer>>, Bits) ->
    binary:at(Bits, N).

不幸的是,当Bin为4个字节或更少时,匹配器不起作用。是否有更好的方法来使其余的可以为空?如果我可以避免在调用者中测试二进制长度,那就更好了。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

foo(<<A:16/little-unsigned-integer,B:16/little-unsigned-integer,_Rest/binary>>, Bits) ->
    (binary:at(Bits, A) =/= 0) and (binary:at(Bits, B) =/= 0).

这不适用于长度小于4个字节的二进制文件。那种情况应该发生什么?

N.B。 binary:at/2适用于二进制文件而不是位串,偏移量以字节为单位。