Skip to main content
CRC Calc

CRC-16 / CMS

Width16-bitRefInNoRefOutNo

Need custom parameters? Open in full calculator

Standard test string

Result

0xAEE7

Similar CRC Algorithms

Result is calculated from the current input. Check is the published verification value for the standard input 123456789. Click another algorithm to view its detail page.

CRC Lookup Table

0x00000x80050x800F0x000A0x801B0x001E0x00140x80110x80330x00360x003C0x80390x00280x802D0x80270x0022
0x80630x00660x006C0x80690x00780x807D0x80770x00720x00500x80550x805F0x005A0x804B0x004E0x00440x8041
0x80C30x00C60x00CC0x80C90x00D80x80DD0x80D70x00D20x00F00x80F50x80FF0x00FA0x80EB0x00EE0x00E40x80E1
0x00A00x80A50x80AF0x00AA0x80BB0x00BE0x00B40x80B10x80930x00960x009C0x80990x00880x808D0x80870x0082
0x81830x01860x018C0x81890x01980x819D0x81970x01920x01B00x81B50x81BF0x01BA0x81AB0x01AE0x01A40x81A1
0x01E00x81E50x81EF0x01EA0x81FB0x01FE0x01F40x81F10x81D30x01D60x01DC0x81D90x01C80x81CD0x81C70x01C2
0x01400x81450x814F0x014A0x815B0x015E0x01540x81510x81730x01760x017C0x81790x01680x816D0x81670x0162
0x81230x01260x012C0x81290x01380x813D0x81370x01320x01100x81150x811F0x011A0x810B0x010E0x01040x8101
0x83030x03060x030C0x83090x03180x831D0x83170x03120x03300x83350x833F0x033A0x832B0x032E0x03240x8321
0x03600x83650x836F0x036A0x837B0x037E0x03740x83710x83530x03560x035C0x83590x03480x834D0x83470x0342
0x03C00x83C50x83CF0x03CA0x83DB0x03DE0x03D40x83D10x83F30x03F60x03FC0x83F90x03E80x83ED0x83E70x03E2
0x83A30x03A60x03AC0x83A90x03B80x83BD0x83B70x03B20x03900x83950x839F0x039A0x838B0x038E0x03840x8381
0x02800x82850x828F0x028A0x829B0x029E0x02940x82910x82B30x02B60x02BC0x82B90x02A80x82AD0x82A70x02A2
0x82E30x02E60x02EC0x82E90x02F80x82FD0x82F70x02F20x02D00x82D50x82DF0x02DA0x82CB0x02CE0x02C40x82C1
0x82430x02460x024C0x82490x02580x825D0x82570x02520x02700x82750x827F0x027A0x826B0x026E0x02640x8261
0x02200x82250x822F0x022A0x823B0x023E0x02340x82310x82130x02160x021C0x82190x02080x820D0x82070x0202

CRC Source Code

/* 
 * Model: CRC-16 / CMS (16-bit)
 * Poly: 0x8005, Init: 0xFFFF, XorOut: 0x0000
 * CRC Table C Source Code & Lookup Table Generator
 */
#include <stdint.h>
#include <stddef.h>

const uint16_t crc_table[256] = {
  0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, 
  0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022, 
  0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072, 
  0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041, 
  0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2, 
  0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, 
  0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1, 
  0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082, 
  0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192, 
  0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1, 
  0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1, 
  0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2, 
  0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151, 
  0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162, 
  0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132, 
  0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101, 
  0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312, 
  0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321, 
  0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371, 
  0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342, 
  0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1, 
  0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2, 
  0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2, 
  0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381, 
  0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291, 
  0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2, 
  0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, 
  0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1, 
  0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252, 
  0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261, 
  0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, 
  0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202
};

uint16_t calculate_crc(const uint8_t *data, size_t length) {
    uint16_t crc = 0xFFFF;
    for (size_t i = 0; i < length; i++) {
        #if 0
        uint8_t idx = (uint8_t)(crc ^ data[i]);
        crc = (crc >> 8) ^ crc_table[idx];
        #else
        uint8_t idx = (uint8_t)((crc >> 8) ^ data[i]);
        crc = (crc << 8) ^ crc_table[idx];
        #endif
    }
    return crc ^ 0x0000;
}

About CRC-16/CMS

CRC-16/CMS is a non-reflected 16-bit model using the 0x8005 polynomial.

CRC-16/CMS is a 16-bit CRC model defined by polynomial 0x8005, an initial register value of 0xFFFF, and final XOR 0x0000. It uses normal, non-reflected input and output processing.

Documented application context for this model includes Embedded systems, Legacy protocols, Data integrity. The calculator above applies this exact parameter set to the current input; the published Check value below is instead the fixed verification result for ASCII 123456789.

Standard test vector

CRC implementations are commonly verified with the ASCII input 123456789.

Input format
ASCII
Input
123456789
Expected CRC
0xAEE7
Residue
0x0000

Model characteristics

A model is identified by its complete parameter set, not its polynomial alone.

Bit order
Normal
Register start
0xFFFF
Final XOR
0x0000
Published check
0xAEE7

Implementation checks for CRC-16/CMS

  • Use a 16-bit register and polynomial 0x8005.
  • Initialize the register to 0xFFFF and use XorOut 0x0000 exactly as listed; changing either value defines a different model.
  • Verify the implementation with ASCII “123456789”; the expected result is 0xAEE7.

Continue with the main calculator, browse the algorithm catalog, compare models in the Algorithm Reference section, or generate a lookup table.

Complete CRC-16/CMS parameters

CRC parameter guide
ParameterValueMeaningReference
Width16 bitsCRC register and result widthRead guide
Poly0x8005Generator polynomial without the leading termRead guide
Init0xFFFFInitial CRC register valueRead guide
RefInNoReflect each input byte before processingRead guide
RefOutNoReflect the register before XOR OutRead guide
XorOut0x0000Final value XORed with the CRC registerRead guide
Check0xAEE7CRC of ASCII “123456789”Read guide
Residue0x0000Expected residue after appending a valid CRCRead guide
AliasesCMS CRC-16

Where CRC-16/CMS is used

  • 01Embedded systems
  • 02Legacy protocols
  • 03Data integrity

CRC-16/CMS FAQ

What is the check value for CRC-16/CMS?

For the standard ASCII test input 123456789, the check value of CRC-16/CMS is 0xAEE7.

What polynomial does CRC-16/CMS use?

CRC-16/CMS uses the 16-bit polynomial 0x8005.

Does CRC-16/CMS use reflected input and output?

For CRC-16/CMS, RefIn is No and RefOut is No.

What is CRC-16/CMS commonly confused with?

CRC-16/DDS-110 uses the same polynomial (0x8005), which is the usual source of mix-ups — matching the polynomial alone does not reproduce CRC-16/CMS. The two models differ in initial value, so a port from one to the other needs those fields checked explicitly, not just the poly.