【发布时间】:2015-12-25 06:19:08
【问题描述】:
我正在尝试计算某些数据的校验和。这是代码:
#include <stdio.h>
#include <string.h>
int main()
{
char MyArray[] = "my secret data";
char checksum = 0;
int SizeOfArray = strlen(MyArray);
for(int x = 0; x < SizeOfArray; x++)
{
checksum += MyArray[x];
}
printf("Sum of the bytes for MyArray is: %d\n", checksum);
printf("The checksum: \n");
checksum = (checksum ^ 0xFF);
printf("%d\n",checksum);
}
输出:
Sum of the bytes for MyArray is: 70
The checksum:
-71
代码中的修改:
#include <stdio.h>
#include <string.h>
int main()
{
char MyArray[] = "my secret data";
char checksum = 0; // could be an int if preferred
int SizeOfArray = strlen(MyArray);
for(int x = 0; x < SizeOfArray; x++)
{
checksum += MyArray[x];
}
printf("Sum of the bytes for MyArray is: %d\n", checksum);
//Perform bitwise inversion
checksum=~checksum;
//Increment
checksum++;
printf("Checksum for MyArray is: %d\n", checksum);
}
输出:
Sum of the bytes for MyArray is: 70
Checksum for MyArray is: -70
为什么要修改校验和值?不同的算法会提供不同的校验和吗?
最终价值有什么用处?好吧,实际上我不清楚校验和及其在数据验证中的用途。我在网上搜索了很多文章,但仍然不清楚。希望我今天能在这里了解校验和。
【问题讨论】:
-
这是一个很差的校验和。两个随机文件将具有相同的校验和,概率为 1/256。这对于实际应用来说是相当无用的。
-
@n.m.感谢您的评论。你能添加一个答案并解释一下校验和吗?
-
考虑一种情况,发件人发送例如一个文件,带有校验和给任何人。发送时会出错,因此更改了一位。接收方会得到损坏的文件,所以他会用与发送方相同的算法计算校验和,并与接收方的校验和进行比较。它会有所不同,因此他会知道此消息已损坏,因此接收者可以要求发送者重新发送文件。
-
这里有一个更好的校验和算法:en.wikipedia.org/wiki/Adler-32 还有很多其他不同的速度、复杂性和质量。
-
看下面的答案,不错的