2010-10-26 124 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.