我目前正在Erlang編寫一個函數,它需要沒有尾隨零的二進制文件。由於實現和其他輸入,將返回的東西將會有尾隨零。在Erlang中以二進制形式拖尾0s
換句話說,我將具有的東西,如:
<<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>>
零點前最後需要保留連續的零。
如果有人可以提供解決方案,將不勝感激。謝謝!
我目前正在Erlang編寫一個函數,它需要沒有尾隨零的二進制文件。由於實現和其他輸入,將返回的東西將會有尾隨零。在Erlang中以二進制形式拖尾0s
換句話說,我將具有的東西,如:
<<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>>
零點前最後需要保留連續的零。
如果有人可以提供解決方案,將不勝感激。謝謝!
的簡單和直接的方法是這樣的:
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>>
我建議您用真實的數據剖析它,看它是否會爲你工作。
一個解決方案,我注意到@ 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>>
你可以用這個簡單的函數:
-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]).
謝謝,這確實* *工作。 – caluga
另外,我發現我還可以使用這樣的: 修整(A) - > \t情況下二進制:部分:在(A,byte_size(A) - - 1)>修剪(二進制==的 \t \t真0 (A,{0,byte_size(A)-1})); \t \t false - > A \t end。 這意味着無需轉換爲列表並返回。無論如何,一切都解決了,謝謝! – caluga
這是真的,但你的方式也做了很多不必要的操作,並創建了很多必須清理的垃圾。只要您處理的二進制文件很小,並且沒有很多尾隨0,那麼您將會很好,但在將這些文件放入真實系統之前,您仍然需要使用實際數據分析兩種方式。順便說一句,你的方式也失敗的空二進制文件或包含所有0的二進制文件。 –