Binary erlang校验和
上帝啊,早上好 我正在尝试对以下函数执行校验和Binary erlang校验和,binary,erlang,checksum,Binary,Erlang,Checksum,上帝啊,早上好 我正在尝试对以下函数执行校验和 Data = [<<"9">>,"81", <<1>>, <<"52=">>, [[50,48,49,48,49,48,50,54,45,49,53,":",52,53,":",52,52]], <<1>>, <<1>>, [<<"9">&g
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>>]]
它基本上需要将数据分解成离散的数字
理想情况下,它看起来像[56,45,34111233,…]
然后把它们加在一起
无论我尝试什么,编译器都会给我错误。在它变得非常简单之前,我已经解决了它,但是现在食物链上的一个变化影响了这一点
请帮忙,并致以最良好的祝愿 请尝试以下代码:
checksum(Data) -> checksum(iolist_to_binary(Data), 0).
checksum(<<I, T/binary>>, Acc) -> checksum(T, I + Acc);
checksum(<<>>, Acc) -> Acc.
checksum(数据)->checksum(iolist_到_二进制(数据),0)。
校验和(,Acc)->校验和(T,I+Acc);
校验和(,Acc)->Acc。
在这里,您将I
设置为H
,这可能是一个列表,或者binary\u to_llist(H)
,这肯定是一个列表
checksum(T, I + Acc);
您正在添加I
和Acc
,但是I
可能是一个列表。您不能将列表添加到数字
如果
H
是一个列表,则应将I设置为H
的校验和;如果H
是一个二进制,则应将I设置为H
的校验和。如果需要计算CRC32之类的标准,或者可以使用和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
校验和([A | B])->校验和(A)+校验和(B);
校验和([])->0;
校验和()->A+校验和(B);
校验和()->0;
校验和(A)->A。
首先,您要添加两个列表。如果这是你想要的,你应该做++而不是+。
checksum(T, I + Acc);
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
4> erlang:phash2(Data).
38926910
5> erlang:phash2(Data, 65536).
64062
checksum([A|B]) -> checksum(A) + checksum(B);
checksum([]) -> 0;
checksum(<<A, B/binary>>) -> A + checksum(B);
checksum(<<>>) -> 0;
checksum(A) -> A.