# Longitudinal redundancy check

In telecommunication, a longitudinal redundancy check (LRC) or horizontal redundancy check is a form of redundancy check that is applied independently to each of a parallel group of bit streams. The data must be divided into transmission blocks, to which the additional check data is added.

The term usually applies to a single parity bit per bit stream, calculated independently of all the other bit streams (BIP-8).[1][2] although it could also be used to refer to a larger Hamming code.[citation needed]

This "extra" LRC word at the end of a block of data is very similar to checksum and CRC.

## Optimal Rectangular Code

While simple longitudinal parity can only detect errors, it can be combined with additional error control coding, such as a transverse redundancy check, to correct errors. The transverse redundancy check is stored on a dedicated "parity track".

Whenever any single bit error occurs in a transmission block of data, such two dimensional parity checking or "two-coordinate parity checking"[3] enables the receiver to use the TRC to detect which byte the error occurred in, and the LRC to detect exactly which track the error occurred in, to discover exactly which bit is in error, and then correct that bit by flipping it.[4][5][6]

## Pseudocode

International standard ISO 1155[7] states that a longitudinal redundancy check for a sequence of bytes may be computed in software by the following algorithm:

```       Set LRC = 0
For each byte b in the buffer
do
Set LRC = (LRC + b) AND 0xFF
end do
Set LRC = (((LRC XOR 0xFF) + 1) AND 0xFF)

```

which can be expressed as "the 8-bit two's-complement value of the sum of all bytes modulo 28."

Many protocols use an XOR-based longitudinal redundancy check byte, (often called block check character or BCC), including the IEC 62056-21 standard for electrical meter reading, smart cards as defined in ISO/IEC 7816, and the ACCESS.bus protocol. An 8-bit LRC such as this is equivalent to a cyclic redundancy check using the polynomial x8+1, but the independence of the bit streams is less clear when looked at that way.

## C#

```        /// <summary>
/// Longitudinal Redundancy Check (LRC) calculator for a byte array.
/// This was proved from the LRC Logic of Edwards TurboPump Controller SCU-1600.
/// ex) DATA (hex 6 bytes): 02 30 30 31 23 03
///     LRC  (hex 1 byte ): 47
/// </summary>

public static byte calculateLRC(byte[] bytes)
{
byte LRC = 0x00;
for (int i = 0; i < bytes.Length; i++)
{
LRC = (byte)((LRC + bytes[i]) & 0xFF);
}
return (byte)(((LRC ^ 0xFF) + 1) & 0xFF);
}
```

## Java

```    /**
* Calculates the checksum in compliance with the ISO 1155 standard
* @param data array to calculate checksum for
* @return returns the calculated checksum in byte format
*/
public byte calculateLRC(byte[] data) {
byte checksum = 0;
for (int i = 0; i < data.length; i++) {
checksum = (byte) ((checksum + data[i]) & 0xFF);
}
checksum = (byte) (((checksum ^ 0xFF) + 1) & 0xFF);
return checksum;
}
```

## C

```unsigned char calculateLRC(const unsigned char *buffer, unsigned int length){
unsigned char checksum = 0;
while(length--) checksum += *buffer++;
return checksum ^ 0xFF + 1;
}
```

[8]