Skip to main content
CRC Calc

CRC-8 / I-CODE

Width8-bitRefInNoRefOutNo

Need custom parameters? Open in full calculator

Standard test string

Result

0x7E

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

0x000x1D0x3A0x270x740x690x4E0x530xE80xF50xD20xCF0x9C0x810xA60xBB
0xCD0xD00xF70xEA0xB90xA40x830x9E0x250x380x1F0x020x510x4C0x6B0x76
0x870x9A0xBD0xA00xF30xEE0xC90xD40x6F0x720x550x480x1B0x060x210x3C
0x4A0x570x700x6D0x3E0x230x040x190xA20xBF0x980x850xD60xCB0xEC0xF1
0x130x0E0x290x340x670x7A0x5D0x400xFB0xE60xC10xDC0x8F0x920xB50xA8
0xDE0xC30xE40xF90xAA0xB70x900x8D0x360x2B0x0C0x110x420x5F0x780x65
0x940x890xAE0xB30xE00xFD0xDA0xC70x7C0x610x460x5B0x080x150x320x2F
0x590x440x630x7E0x2D0x300x170x0A0xB10xAC0x8B0x960xC50xD80xFF0xE2
0x260x3B0x1C0x010x520x4F0x680x750xCE0xD30xF40xE90xBA0xA70x800x9D
0xEB0xF60xD10xCC0x9F0x820xA50xB80x030x1E0x390x240x770x6A0x4D0x50
0xA10xBC0x9B0x860xD50xC80xEF0xF20x490x540x730x6E0x3D0x200x070x1A
0x6C0x710x560x4B0x180x050x220x3F0x840x990xBE0xA30xF00xED0xCA0xD7
0x350x280x0F0x120x410x5C0x7B0x660xDD0xC00xE70xFA0xA90xB40x930x8E
0xF80xE50xC20xDF0x8C0x910xB60xAB0x100x0D0x2A0x370x640x790x5E0x43
0xB20xAF0x880x950xC60xDB0xFC0xE10x5A0x470x600x7D0x2E0x330x140x09
0x7F0x620x450x580x0B0x160x310x2C0x970x8A0xAD0xB00xE30xFE0xD90xC4

CRC Source Code

/* 
 * Model: CRC-8 / I-CODE (8-bit)
 * Poly: 0x1D, Init: 0xFD, XorOut: 0x00
 * CRC Table C Source Code & Lookup Table Generator
 */
#include <stdint.h>
#include <stddef.h>

const uint8_t crc_table[256] = {
  0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53, 
  0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, 
  0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, 
  0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76, 
  0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, 
  0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C, 
  0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, 
  0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1, 
  0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, 
  0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, 
  0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D, 
  0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, 
  0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7, 
  0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, 
  0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A, 
  0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, 
  0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, 
  0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D, 
  0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, 
  0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50, 
  0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, 
  0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A, 
  0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, 
  0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, 
  0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66, 
  0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, 
  0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB, 
  0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, 
  0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1, 
  0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, 
  0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, 
  0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4
};

uint8_t calculate_crc(const uint8_t *data, size_t length) {
    uint8_t crc = 0xFD;
    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 >> 0) ^ data[i]);
        crc = (crc << 8) ^ crc_table[idx];
        #endif
    }
    return crc ^ 0x00;
}

About CRC-8/I-CODE

CRC-8/I-CODE is an 8-bit CRC used with I-CODE identification products.

CRC-8/I-CODE is a 8-bit CRC model defined by polynomial 0x1D, an initial register value of 0xFD, and final XOR 0x00. It uses normal, non-reflected input and output processing.

Documented application context for this model includes RFID, I-CODE, Identification systems. 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
0x7E
Residue
0x00

Model characteristics

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

Bit order
Normal
Register start
0xFD
Final XOR
0x00
Published check
0x7E

Implementation checks for CRC-8/I-CODE

  • Use a 8-bit register and polynomial 0x1D.
  • Initialize the register to 0xFD and use XorOut 0x00 exactly as listed; changing either value defines a different model.
  • Verify the implementation with ASCII “123456789”; the expected result is 0x7E.

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

Complete CRC-8/I-CODE parameters

CRC parameter guide
ParameterValueMeaningReference
Width8 bitsCRC register and result widthRead guide
Poly0x1DGenerator polynomial without the leading termRead guide
Init0xFDInitial CRC register valueRead guide
RefInNoReflect each input byte before processingRead guide
RefOutNoReflect the register before XOR OutRead guide
XorOut0x00Final value XORed with the CRC registerRead guide
Check0x7ECRC of ASCII “123456789”Read guide
Residue0x00Expected residue after appending a valid CRCRead guide
AliasesI-CODE CRC-8

Where CRC-8/I-CODE is used

  • 01RFID
  • 02I-CODE
  • 03Identification systems

CRC-8/I-CODE FAQ

What is the check value for CRC-8/I-CODE?

For the standard ASCII test input 123456789, the check value of CRC-8/I-CODE is 0x7E.

What polynomial does CRC-8/I-CODE use?

CRC-8/I-CODE uses the 8-bit polynomial 0x1D.

Does CRC-8/I-CODE use reflected input and output?

For CRC-8/I-CODE, RefIn is No and RefOut is No.

What is CRC-8/I-CODE commonly confused with?

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