Cyclic Redundancy Check (crc)

Keywords: cyclic redundancy check CRC checksum error detection crc32 crc24 crc16

A cyclic redundancy check (CRC) is, in essence, a strong algebraic error detection code that computes a key on a block of data using base-2 polynomials. While it is a strong error-detection method, a CRC is not an error-correction code. Here is a simple example:

#include <liquid/liquid.h>

int main() {
    // initialize data array
    unsigned char data[4] = {0x25, 0x62, 0x3F, 0x52};
    crc_scheme scheme = LIQUID_CRC_32;

    // compute CRC on original data
    unsigned char key = crc_generate_key(scheme, data, 4);

    // ... channel ...

    // validate (received) message
    int valid_data = crc_validate_message(scheme, data, 4, key);
}

Also available for error detection in liquid is a checksum. A checksum is a simple way to validate data received through un-reliable means (e.g. a noisy channel). A checksum is, in essence, a weak error detection code that simply counts the number of ones in a block of data (modulo 256). The limitation, however, is that multiple bit errors might result in a false positive validation of the corrupted data. The checksum is not a strong an error detection scheme as the cyclic redundancy check.[ref:tab-crc-codecs] lists the available codecs and gives a brief description for each.

Table [tab-crc-codecs]. Error-detection codecs available in liquid

Scheme Size (bits) Description
LIQUID_CRC_UNKNOWN - unknown/unsupported scheme
LIQUID_CRC_NONE 0 no error-detection
LIQUID_CRC_CHECKSUM 8 basic checksum
LIQUID_CRC_8 8 8-bit CRC, poly= 0x07
LIQUID_CRC_16 16 16-bit CRC, poly= 0x8005
LIQUID_CRC_24 24 24-bit CRC, poly= 0x5D6DCB
LIQUID_CRC_32 32 32-bit CRC, poly= 0x04C11DB7

For a detailed example program, see examples/crc_example.c in the main liquid directory.