计算我创建的自定义结构的校验和

时间:2018-03-16 14:36:13

标签: c struct checksum packet

大家好我正在尝试计算我所做的结构的校验和。 我创建了一个包含多个char和int变量的struct数据包。 有没有办法计算这种结构的校验和?

我的第一个猜测是,计算数据包大小,然后使用一个周期来计算每个位置的值,将它们加在一起,然后返回该值。

问题是我不知道如何计算这个数据包的每个位置,因为有多种类型的变量导致它是一个结构。

你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这里需要的是访问结构的每个字节。您可以通过获取其地址,将其转换为unsigned char *,将地址分配给该类型的变量,然后使用该变量循环遍历字节来实现:

unsigned int sum = 0;
unsigned char *p = (unsigned char *)&mystruct;
for (int i=0; i<sizeof(mystruct); i++) {
    sum += p[i];
}

但是请注意,如果你的struct包含任何填充,那么填充字节的值是未指定的,这样就会弄乱你的校验和。如果是这种情况,那么您需要单独为结构中的每个字段执行上述操作。

例如:

unsigned int sum = 0;
unsigned char *p = (unsigned char *)&mystruct.field1;
for (int i=0; i<sizeof(mystruct.field1); i++) {
    sum += p[i];
}
p = (unsigned char *)&mystruct.field2;
for (int i=0; i<sizeof(mystruct.field2); i++) {
    sum += p[i];
}