LRC校验(纵向冗余校验)

最近用Modbus-ASCII用到了,py简单实现一下仅作了解,实际工程中用c写

# LRC校验
#s = "0103000A0001"  #测试1 结果0xAA
#s2 = "1234567890"    #测试2 结果0xF3

def LRC_Cal(s):
    n = 0
    LRC = 0
    for i in range(0, len(s)):
        n += ord(s[i])  #ascii值之和

    n = (~(n%256))+1    #取模忽略进位(0x100 = 256) 取反加一
    LRC = hex(n&0xFF)   #转无符号十六进制
    return LRC
  
if __name__ == "__main__":
    while True:
        print("Please input:")
        s = input()
        print("Output: " + LRC_Cal(s))
        print("-----------------------")

LRC计算的实现方法也可为

def LRC_Cal(s):
    n = 0
    LRC = 0
    for i in range(0, len(s)):
        n += ord(s[i])  #ascii值之和
    LRC = hex(-n&0xFF)   #转无符号十六进制
    return LRC

(注:负数求补码的方法即为 原码取反加一,此时忽略符号位即为所求结果)

在线LRC计算 http://www.ip33.com/lrc.html
LRC校验原理参考 https://wenku.baidu.com/view/c9e03958312b3169a451a438.html

C语言实现(注:返回值为十六进制数值,要与源字符串相比较需要进行数值到ASCII的转换

uint8_t LRC_Cal(const uint8_t* buf, uint8_t len)
{
    uint8_t LRC = 0;
    while(len--)
    {
        LRC += *buf++;
    }
    LRC = (uint8_t)(-LRC);
    return LRC;
}

其中uint8_t定义为typedef unsigned char uint8_t;

你可能感兴趣的:(其他)