今天在工作上遇到了一个任务,任务主要是把binary的数据保存到片外Flash上面。我的任务只是提供这个binary的文件,在系统运行后,我需要在Flash的保存地址上再回读这个binary文件,解析并运行。简单设计了一个文件info的头结构体,仅有16字节。想来想去,还是添加一个头部数据校验字段,以保证头部信息数据的正确性。这次我选择了LRC校验算法。
正文
LRC(Longitudinal Redundancy Check)纵向冗余校验算法是一种用于检测数据传输错误的技术,通过在数据块中添加冗余信息,使得接收方可以通过校验算法验证数据的完整性。LRC校验算法简单、高效,适用于数据传输和存储中的错误检测。
一、LRC校验算法的基本原理
LRC校验算法就是将参与校验的数据求和,取其低8位的补码为校验码。LRC算法原理也清晰的表明,校验字段的位置并不影响结果。
二、LRC校验算法的实现
static UCHAR prvucMBLRC( UCHAR * pucFrame, USHORT usLen ){ UCHAR ucLRC = 0; /* LRC char initialized */ while( usLen-- ){ ucLRC += *pucFrame++; /* Add buffer byte without carry */ } /* Return twos complement */ ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) ); return ucLRC; }
三、LRC校验算法的优缺点
LRC校验算法的优点主要包括:简单易实现、运算速度快、适用应用场景多等。然而,LRC校验算法也存在一些缺点:
1. 对于较长的数据块,LRC校验算法的检测能力较弱。这是因为LRC校验算法是基于字节的求和运算,当数据块长度较长时,单个字节的错误可能不会影响整个数据块的校验结果。
2. LRC校验算法无法纠正传输过程中的错误。一旦检测到错误,接收方只能选择纠正或重传数据块。
3. LRC校验算法无法检测数据块是否被篡改。如果数据块在传输过程中被篡改,即使校验码一致,接收方也无法得知数据的真实性。
四、总结
LRC校验算法是一种简单、高效的错误检测技术,对于校验数据量较小(小于256字节)的应用场景较为适合。然而,对于需要更高检测能力的场景,可能需要选择更复杂的校验算法,如CRC算法或更高级的纠错编码技术。在实际应用中,根据具体需求选择合适的校验算法是至关重要的。