2016-12-16 56 views
1

我目前正在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

的簡單和直接的方法是這樣的:

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>> 

我建議您用真實的數據剖析它,看它是否會爲你工作。

+0

謝謝,這確實* *工作。 – caluga

+0

另外,我發現我還可以使用這樣的: 修整(A) - > \t情況下二進制:部分:在(A,byte_size(A) - - 1)>修剪(二進制==的 \t \t真0 (A,{0,byte_size(A)-1})); \t \t false - > A \t end。 這意味着無需轉換爲列表並返回。無論如何,一切都解決了,謝謝! – caluga

+1

這是真的,但你的方式也做了很多不必要的操作,並創建了很多必須清理的垃圾。只要您處理的二進制文件很小,並且沒有很多尾隨0,那麼您將會很好,但在將這些文件放入真實系統之前,您仍然需要使用實際數據分析兩種方式。順便說一句,你的方式也失敗的空二進制文件或包含所有0的二進制文件。 –

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>> 
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]).