前言由于外界总是会对电路产生或多或少的干扰,因此对于数字信号,所传输的数据可能会非常不同。
在许多需要传输数据的场合,尤其是某些数据可能会影响某些硬件(例如某些嵌入式设备,机器人等)的动作,错误的数据可能会带来一些隐藏的风险,这是很难想到的。
由于我从事嵌入式相关领域的工作,因此我通常会玩单片机。
当然,单片机的性能差别很大。
但是,许多表演只能说还不够。
因此,当今的验证算法相对简单,但有效,尤其是对于某些性能一般的硬件而言。
谈到今天的主角:累积和验证算法,也称为CheckSum算法。
至于消息来源,我在这里不会小心。
累积和校验算法的实现。
发件人:累积数据以获取数据总和,然后求和以取反得到我们的校验值。
然后将要发送的数据与校验值一起发送到接收器。
接收器:累积接收到的数据(包括校验和),然后加1。
如果您获得0,则数据中没有传输错误。
注意,发送者和接收者用来保存累加结果的类型必须相同,否则溢出不能通过加1来实现,因此不能得到0,并且验证将无效。
让我们再举一个例子:发送者:要发送0xA8、0x50,我们使用unsignedchar(8位)来保存累加的总和,即0xF8(0b11111000),而校验和为0x07(0b00000111)。
然后将这三个数据发送出去。
收件人:如果接收正确,则这三个数据的累加和为(0b11111111),这时,加1,结果为0(实际结果应为0b100000000,但是因为使用了unsignedchar(8位)保存累加和,因此高位被截断,仅留下低8位(0)。
从上面的示例中,我们可以知道该算法的目的是将累加和与校验值相加以获得每个位的二进制值都是1的结果。
此结果显然很容易处理,并且该算法实施起来也很简单。
下面给出了C语言的代码示例。
发件人:以下是如何获取检查值的代码,结果是我们想要的检查值。
接收方:输入包含发送方发送的校验值。
如果函数返回的值为0,则数据正确。