Validate Longitudinal Redundancy Checksum

Submitted by:Andery Smith

Date added:08 May, 2016

Category:C++

Source code for Validate Longitudinal Redundancy Checksum

Tags: validate , longitudinal , redundancy , checksum

Code Snippet:

/*$Workfile: KIsLRC.cpp$: implementation file
$Revision: 5$ $Date: 2005-06-17 18:10:52$
$Author: Darko Kolakovic$

Validates Longitudinal Redundancy Checksum (LRC)
CommonSoft Inc.
Jan. 2k Darko Kolakovic
*/

/*Note: MS VC/C++ - Disable precompiled headers (/Yu"stdafx.h" option) */

#ifndef _KCHARCST_H_
#include "KCharCst.h" //ETX
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef BYTE
#define BYTE unsigned char
#endif

#ifndef NULL
#ifdef __cplusplus
//NULL pointer value
#define NULL 0
#else
/*NULL pointer value */
#define NULL ((void *)0)
#endif
#endif

extern "C" BYTE GetLRC(BYTE* pbData,int iCount);

//IsLRCValid()-----------------------------------------------------------------
/*Validates Longitudinal Redundancy Checksum (LRC).

Returns: true if given LRC is same as calculated. If checksums are different
or if the last byte in data array is not termination character (EOT/ETB/ETX)
or if the length of the data is zero, returned value is false.

Example:

{
...
BYTE chData[10] = {STX,'1','2','3','4','5','6','7',EOT};
chData[9] = GetLRC(&chData[1],8);
...
if(IsLRCValid(chData[9],&chData[1],8))
TRACE0("LRC is valid\n");
}
*/
bool IsLRCValid(const BYTE chReceivedLRC, //[in] value to be verified
BYTE* pbData, //[in] data buffer including
//termination character (EOT/ETB/ETX)
int iCount //[in] size of data in bytes including
//termination character (minimum value is 1)
)
{
if ((pbData != NULL) && (iCount > 0) )
{
if ((pbData[iCount - 1] == EOT) ||
(pbData[iCount - 1] == ETB) ||
(pbData[iCount - 1] == ETX))
if (chReceivedLRC == GetLRC(pbData,iCount))
return true;
}

return false;
}

///////////////////////////////////////////////////////////////////////////////
/*$Workfile: KGetLRC.cpp$: implementation file
$Revision: 4$ $Date: 2004-06-01 17:50:31$
$Author: Darko$

Longitudinal Redundancy Checksum (LRC)
Copyright: CommonSoft Inc.
4.5.1989 Darko Kolakovic (original C version)
*/

/*Note: MS VC/C++ - Disable precompiled headers (/Yu"stdafx.h" option) */

#ifndef _KCHARCST_H_
#include "KCharCst.h" //ETX
#endif

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef BYTE
#define BYTE unsigned char
#endif

extern "C" BYTE GetLRC(BYTE* pbData,int iCount);

//GetLRC()---------------------------------------------------------------------
/*Calculates one byte Longitudinal Redundancy Checksum (LRC). The LRC is an
exclusive-or calculation on all data bytes. The LRC is calculated from the
begining of data buffer to the termination character, including termination
character itself.

Returns: Longitudinal Redundancy Checksum (LRC).


+---+
|STX| Start of Text [1 Byte]
/--+---+--
| | D | Data [N bytes]
L | a |
R | t |
C | a |
+---+
s |ETX|
u |ETB| Termination Character [1 Byte]
m |EOT|
\--+---+--
|LRC| Longitudinal Redundancy Checksum [1 Byte]
+---+
iCount = N+1 [byte]

*/
BYTE GetLRC(BYTE* pbData, //[in] data buffer including
//termination character (ETB/ETX/EOT)
int iCount //[in] size of data in bytes including
//termination character
)
{
BYTE chLRC = 0;
while(iCount > 0)
{
chLRC ^= *pbData++;
iCount--;
}

return chLRC;
}

///////////////////////////////////////////////////////////////////////////////
 
 

Comments