Эрланг - контрольная сумма
Годд Утро,
Я пытаюсь выполнить контрольную сумму по следующей функции
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 ответа
Попробуйте следующий код:
checksum(Data) -> checksum(iolist_to_binary(Data), 0).
checksum(<<I, T/binary>>, Acc) -> checksum(T, I + Acc);
checksum(<<>>, Acc) -> Acc.
Если вам нужно вычислить стандартные CRC, такие как CRC32 или Adler-32, вы можете использовать erlang:crc32 и erlang: 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
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
это двоичный файл
checksum([A|B]) -> checksum(A) + checksum(B);
checksum([]) -> 0;
checksum(<<A, B/binary>>) -> A + checksum(B);
checksum(<<>>) -> 0;
checksum(A) -> A.