erlang - контрольная сумма - PullRequest
       23

erlang - контрольная сумма

3 голосов
/ 26 октября 2010

Годд Утро,

Я пытаюсь выполнить контрольную сумму для следующей функции

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

, а затем сложите их все вместе.

Компилятор выдаёт мне ошибки, что бы я ни пытался. У меня было решение, прежде чем это было очень просто, но теперь одно изменение в пищевой цепи повлияло на это.

Пожалуйста, помогите, и наилучшие пожелания!

Ответы [ 4 ]

3 голосов
/ 26 октября 2010

Попробуйте следующий код:

checksum(Data) ->                 checksum(iolist_to_binary(Data), 0).
checksum(<<I, T/binary>>, Acc) -> checksum(T,  I + Acc);
checksum(<<>>, Acc) ->            Acc.
2 голосов
/ 27 октября 2010

Если вам нужно вычислить стандартные CRC , такие как CRC32 или Adler-32 , вы можете использовать erlang: crc32 и erlang: adler32 BIFs, как это:

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
1 голос
/ 26 октября 2010
if
    is_binary(H) ->
        I = binary_to_list(H); 
    true ->
        I = H

Здесь вы устанавливаете I на H, который может быть списком, или binary_to_llist(H), который определенно является списком.

checksum(T,  I + Acc);

Вы добавляете Iи Acc, но I может быть списком.Вы не можете добавить список к числу.

Вы должны установить I в качестве контрольной суммы H, если H - список, или контрольной суммы binary_to_list(H), если H - двоичный файл.

0 голосов
/ 27 октября 2010
checksum([A|B]) -> checksum(A) + checksum(B);
checksum([]) -> 0;
checksum(<<A, B/binary>>) -> A + checksum(B);
checksum(<<>>) -> 0;
checksum(A) -> A.
...