Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary erlang校验和_Binary_Erlang_Checksum - Fatal编程技术网

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.