【问题标题】:8 bit checksum with wraparound in C8位校验和,C语言环绕
【发布时间】:2014-10-21 04:19:28
【问题描述】:

我制作了一个 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)

【问题讨论】:

  • "overflow carries on the left are not added back on the right" 这通常不是溢出或环绕的工作方式。
  • 校验和的计算通常会忽略进位/溢出。您确定要将溢出添加回产品中吗?
  • 我正在控制发送方和接收方,所以它可以正常工作。我只是遵循规范,但很高兴知道标准是什么以备将来通知,谢谢:)

标签: c networking checksum


【解决方案1】:

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

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 完成的。

【讨论】:

  • 对于“糖”这个词,我通过查看 ASCII 表进行了计算:en.cppreference.com/w/cpp/language/ascii, 115 + 117 + 103 + 97 + 114,其中 1 的进位结果为 232 的临时总和,然后335+1, 433+1, 548+1 = 549 final 比仅仅将 546 相加大 3。因此,当小计超过可能的 8 位表示时,您加 1,但似乎我应该加 256。
  • 读到 unsigned 是 0 到 255,signed 是 -127 到 127。
  • 无符号 8 位 char 的范围是 0..255。有符号 8 位 char 的范围取决于您是否有符号和大小、一个补码或二进制补码算术。使用一个补码和符号和大小,零有两种表示形式(正和负),范围确实是 -127 到 +127。对于二进制补码,范围内存在不对称性:-128 到 +127(以及零的单一表示)。您不太可能遇到不使用二进制补码算法的机器。
猜你喜欢
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多