2010-10-26 83 views
3

二年即可回收上午,二郎 - 校驗

我想在下面的函數

Data = [<<"9">>,"81", 
     <<1>>, 
     <<"52=">>, 
     [[50,48,49,48,49,48,50,54,45,49,53,":",52,53,":",52,52]], 
     <<1>>, 
     <<1>>, 
     [<<"9">>,<<"0">>,<<1>>], 
     [<<"5">>,<<"4">>,<<1>>]] 

使用進行校驗和:

checksum(Data) -> checksum(Data, 0). 
checksum([H | T], Acc) -> 
    if 
     is_binary(H) -> 
      I = binary_to_list(H); 
     true -> 
      I = H 
    end, 
    checksum(T, I + Acc); 

checksum([], Acc) -> Acc. 

它基本上需要打破數據分解成離散數字

理想它看起來像[56,45,34,111,233,...]

然後將它們全部加在一起。

無論我嘗試什麼,編譯器都會給我提供錯誤。在它非常簡單之前,我已經解決了它,但現在食物鏈的一個變化影響了這一點。

請幫助,祝好!

+0

要首先,您要添加兩個列表。你應該做++而不是+,如果這是你想要的。 – 2010-10-26 17:42:43

回答

3

試試下面的代碼:

checksum(Data) ->     checksum(iolist_to_binary(Data), 0). 
checksum(<<I, T/binary>>, Acc) -> checksum(T, I + Acc); 
checksum(<<>>, Acc) ->   Acc. 
+0

http://pastie.org/1250452 - 這裏是一個實際的代碼示例 – gleber 2010-10-26 16:35:54

1
if 
    is_binary(H) -> 
     I = binary_to_list(H); 
    true -> 
     I = H 

在這裏,我們設置IH這可能是一個列表或binary_to_llist(H),這絕對是一個列表。

checksum(T, I + Acc); 

您要添加IAcc,但I可能是一個列表。您不能將一個列表添加到數字中。

你應該設定我要的H校驗,如果H是一個列表或binary_to_list(H)校驗,如果H是一個二進制文件。

2

如果你需要計算標準CRC像CRC32或Adler-32可以使用erlang:crc32erlang:adler32內建函數是這樣的:

1> Data = [<<"9">>,"81", 
1>  <<1>>, 
1>  <<"52=">>, 
1>  [[50,48,49,48,49,48,50,54,45,49,53,":",52,53,":",52,52]], 
1>  <<1>>, 
1>  <<1>>, 
1>  [<<"9">>,<<"0">>,<<1>>], 
1>  [<<"5">>,<<"4">>,<<1>>]] 
1> . 
[<<"9">>,"81", 
<<1>>, 
<<"52=">>, 
[[50,48,49,48,49,48,50,54,45,49,53,":",52,53,":",52,52]], 
<<1>>, 
<<1>>, 
[<<"9">>,<<"0">>,<<1>>], 
[<<"5">>,<<"4">>,<<1>>]] 
2> erlang:adler32(Data). 
1636173186 
3> erlang:crc32(Data). 
3649492735 

這也是值得考慮erlang:phash2 BIF:

4> erlang:phash2(Data).  
38926910 
5> erlang:phash2(Data, 65536). 
64062 
0
checksum([A|B]) -> checksum(A) + checksum(B); 
checksum([]) -> 0; 
checksum(<<A, B/binary>>) -> A + checksum(B); 
checksum(<<>>) -> 0; 
checksum(A) -> A.