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,...]
然后将它们全部加在一起。
无论我尝试什么,编译器都会给我错误。我在它变得非常简单之前就已经解决了,但现在改变食物链的一个因素影响了这一点。
请帮忙,祝福!
答案 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: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
答案 2 :(得分:1)
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
可能是一个列表。您无法向数字添加列表。
如果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.