8位校验和,包含C语言

时间:2014-10-21 04:19:29

标签: c networking checksum

我已经制作了一个8位校验和功能,但总和并没有回旋,我的意思是左边的溢出不会再添加到右边。我怎样才能做到这一点?

unsigned char checksum(unsigned char message[], int nBytes) 
{
    unsigned char sum = 0;

    while (nBytes-- > 0)
    {
        sum += *(message++);
    }

    return (~sum);
}

例如,当添加两个字节时,这就是我想要实现的一种环绕:

 1001 1100
+1100 0010
------------
 0101 1111 (sum)
 1010 0000 Checksum (1's complement)

1 个答案:

答案 0 :(得分:2)

这是一个不寻常的要求,但这应该可以解决问题(没有提出效率要求):

unsigned char checksum(unsigned char message[], int nBytes) 
{
    unsigned char sum = 0;

    while (nBytes-- > 0)
    {
        int carry = (sum + *message > 255) ? 1 : 0;
        sum += *(message++) + carry;
    }

    return (~sum);
}

算术和比较是使用int完成的,因为通常的算术转换。