erlang - 校验和

时间:2010-10-26 15:53:06

标签: binary erlang checksum

Godd Morning,

我正在尝试对以下函数执行校验和

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.

它基本上需要将数据分解为离散数字

理想情况下它看起来像[53,55,34,111,233,...]

然后将它们全部加在一起。

无论我尝试什么,编译器都会给我错误。我在它变得非常简单之前就已经解决了,但现在改变食物链的一个因素影响了这一点。

请帮忙,祝福!

4 个答案:

答案 0 :(得分:3)

请尝试以下代码:

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

答案 1 :(得分:2)

如果您需要计算标准CRC,例如CRC32或Adler-32,您可以使用erlang:crc32erlang:adler32 BIF,如下所示:

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

答案 2 :(得分:1)

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

您要将I设置为H,这可能是一个列表或binary_to_llist(H),这绝对是一个列表。

checksum(T,  I + Acc);

您要添加IAcc,但I可能是一个列表。您无法向数字添加列表。

如果H是列表,则应将I设置为H的校验和;如果binary_to_list(H)是二进制,则应将H的校验和设置为。{/ p>

答案 3 :(得分:0)

checksum([A|B]) -> checksum(A) + checksum(B);
checksum([]) -> 0;
checksum(<<A, B/binary>>) -> A + checksum(B);
checksum(<<>>) -> 0;
checksum(A) -> A.