我目前正在Erlang中编写一个函数,它需要没有尾随零的二进制文件。由于实现和其他输入,将返回的内容将尾随零。
换句话说,我将会有以下内容:
<<1,2,3,0,0>>
和<<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>
对于上述情况,我需要获得:
<<1,2,3>>
和<<3,1,0,2,4,5,0,0,2,3,4>>
在最后连续零之前需要保留零。
如果有人能提供解决方案,我们将不胜感激。谢谢!
答案 0 :(得分:2)
简单明了的方法就像:
1> Binary = <<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>.
<<3,1,0,2,4,5,0,0,2,3,4,0,0,0,0,0>>
2> list_to_binary(lists:reverse(lists:dropwhile(fun(0) -> true; (_) -> false end, lists:reverse(binary_to_list(Binary))))).
<<3,1,0,2,4,5,0,0,2,3,4>>
我建议使用实际数据对其进行分析,看看它是否适合您。
答案 1 :(得分:1)
我在评论中注意到@ caluga类似的一个解决方案之前放在一起的解决方案。这个可以处理空的二进制文件或全零。
strip(B) ->
strip(B, erlang:byte_size(B) - 1).
strip(_B, -1) ->
<<>>;
strip(B, Idx) ->
case binary:at(B, Idx) of
0 -> strip(B, Idx - 1);
_ -> binary:part(B, 0, Idx + 1)
end.
1> demo:strip(<<>>).
<<>>
2> demo:strip(<<0>>).
<<>>
3> demo:strip(<<0,0>>).
<<>>
4> demo:strip(<<1,2>>).
<<1,2>>
5> demo:strip(<<1,0,2>>).
<<1,0,2>>
6> demo:strip(<<1,0,2,0>>).
<<1,0,2>>
7> demo:strip(<<1,0,2,0,0>>).
<<1,0,2>>
答案 2 :(得分:0)
您可以使用这个简单的功能:
-module(strip).
-export([trailing0/1]).
trailing0(B) when is_binary(B) ->
S = byte_size(B) - 1,
case B of
<<Prefix:S/bytes, 0>> -> trailing0(Prefix);
_ -> B
end;
trailing0(B) -> error(badarg, [B]).
如果您期望长后缀,可以使用:
trailing0(B) when is_binary(B) ->
S = byte_size(B) - 1,
S2 = S - 7,
case B of
<<Prefix:S2/bytes, 0:64>> -> trailing0(Prefix);
<<Prefix:S/bytes, 0>> -> trailing0(Prefix);
_ -> B
end;
trailing0(B) -> error(badarg, [B]).