我正在尝试解析二进制文件,当涉及将以小端包装的数字返回到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个字节或更少时,匹配器不起作用。是否有更好的方法来使其余的可以为空?如果我可以避免在调用者中测试二进制长度,那就更好了。
答案 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
适用于二进制文件而不是位串,偏移量以字节为单位。