2010-10-26 28 views
3

Godd Matin,Erlang - contrôle

Je suis en train d'effectuer une somme de contrôle sur la fonction suivante

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

utilisant:

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. 

Il a besoin essentiellement de décomposer les données en numéros discrets

idéalement, il ressemblerait à [56,45,34,111,233, ...]

puis ajoutez-les tous ensemble.

Le compilateur me donne des erreurs, peu importe ce que j'essaie. Je l'ai fait résoudre avant que ce soit très simple, mais maintenant un changement dans la chaîne alimentaire a affecté cela.

S'il vous plaît aider, et meilleurs voeux!

+0

Pour Commencez par ajouter deux listes. Vous devriez faire ++ au lieu de + si c'est ce que vous voulez. –

Répondre

3

Essayez le code suivant:

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 - Voici un exemple de code en action – gleber

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

Vous êtes ici la mise en I-H qui pourrait être une liste ou binary_to_llist(H), ce qui est certainement une liste.

checksum(T, I + Acc); 

Vous ajoutez I et Acc, mais I pourrait être une liste. Vous ne pouvez pas ajouter une liste à un nombre.

Vous devez définir I être la somme de contrôle H si H est une liste ou la somme de contrôle binary_to_list(H) si H est un binaire.

2

Si vous devez calculer la norme CRC comme CRC32 ou Adler-32 vous pouvez utiliser erlang:crc32 et erlang:adler32 BIFs comme ceci:

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 

Il est également intéressant de considérer 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.