Click here to Skip to main content
13,344,281 members (56,270 online)
Click here to Skip to main content
Add your own
alternative version


44 bookmarked
Posted 5 Jun 2007

C# CCITT-8 CRC Algorithm

, 6 Feb 2010
Rate this:
Please Sign up or sign in to vote.
An article on a C# Cyclic Redundancy Check (CRC) algorithm


Chances are that if you've arrived at this page, you are communicating with some sort of god-awful, backdated manufacturing/embedded device that requires you to build messages one byte at a time into a frame or some other type of logical package with a CCITT-8 CRC checksum at the end. In any event, I won't bother going into CRCs, checksums and the like here. If you want to read about them, there are plenty of articles on the subject out there.


I couldn't find a C# CCITT-8 CRC algorithm anywhere. So, when I finally got this done, I figured I'd post it in the hopes of helping someone avoid the fruitless search I had undertaken. I also got some great feedback from some random developers and have put some of their helpful comments to use in this updated version of the code. Hope it helps you out.

Using the Code

Here is the example class; it is very simple. You'll probably want to just cut and paste it into your project where appropriate. To use it, pass in a byte array that contains the data you need a checksum for. It will spit the 8bit checksum back out as a single byte. You basically create a new class instance passing in the polynomial you want to use to calculate the checksum with. I have included only 8 bit polynomials here because I think everything else is pretty well represented elsewhere on the net. You can recalculate the table for a single class instance by calling the GenerateTable function and using the property setter to set the table.

/// This enum is used to indicate what kind of checksum you will be calculating.
public enum CRC8_POLY
	CRC8 = 0xd5,
	CRC8_CCITT = 0x07,
	CRC8_SAE_J1850 = 0x1D,
	CRC_8_WCDMA = 0x9b,

/// Class for calculating CRC8 checksums...
public class CRC8Calc {
    private byte[] table = new byte[256];
    public byte Checksum(params byte[] val ) 
		if(val == null) 
			throw new ArgumentNullException("val");
        byte c = 0;

        foreach ( byte b in val ) 
            c = table[c ^ b];
        return c;

	public byte[] Table
			return this.table;
			this.table = value;
	public byte[] GenerateTable(CRC8_POLY polynomial)
		byte[] csTable = new byte[256];
		for ( int i = 0; i < 256; ++i ) 
            int curr = i;
            for ( int j = 0; j < 8; ++j ) 
                if ((curr & 0x80) != 0) 
                    curr = (curr << 1) ^ (int)polynomial;
                    curr <<= 1;
            csTable[i] = (byte)curr;
		return csTable;
    public CRC8Calc(CRC8_POLY polynomial) 
		this.table = this.GenerateTable(polynomial);


using System;

public class CRC8Test
	public static void RunSnippet()
		byte checksum;
		byte[] testVal = new byte[]
		{0xee, 0x01, 0x13, 0x00, 0x06, 0x1c, 0x00, 0x20,  0x1d, 0x00, 0x00};
		CRC8Calc crc_dallas = new CRC8Calc(CRC8_POLY.CRC8_DALLAS_MAXIM);
		checksum = crc_dallas.Checksum(testVal);
		CRC8Calc crc = new CRC8Calc(CRC8_POLY.CRC8_CCITT);
		checksum = crc.Checksum(testVal);
	#region Helper methods
	public static void Main()
		catch (Exception e)
			string error = string.Format
			("---\nThe following error occurred while executing 
				the snippet:\n{0}\n---", e.ToString());
			Console.Write("Press any key to continue...");

	private static void WL(object text, params object[] args)
		Console.WriteLine(text.ToString(), args);	


  • 5th June, 2007 -- Original version posted
  • 5th February, 2010 -- Article updated


This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


About the Author

Rob Magee
Other Apostrophe Systems
United States United States
Rob Magee is a software engineer for Apostrophe Systems specializing in RFID, SAP Auto-Id Infrastructure Integration, Security, C#, Java, ABAP, Python, Supply-Chain and Manufacturing systems, etc.

You may also be interested in...

Comments and Discussions

SuggestionWhat's missing? Pin
Gordon Smith16-Nov-17 6:51
memberGordon Smith16-Nov-17 6:51 
QuestionNote for VB.NET-ers Pin
Simon Dixey22-Nov-12 23:27
memberSimon Dixey22-Nov-12 23:27 
QuestionVerified code, and a comment Pin
SeattleC++11-Sep-12 20:13
memberSeattleC++11-Sep-12 20:13 
QuestionCan you code a dynamic hash function? Pin
Tushar Arora20-Aug-10 8:59
memberTushar Arora20-Aug-10 8:59 
QuestionCRC8-CCITT??? Pin
Mad as a Hatter4-Feb-10 17:45
memberMad as a Hatter4-Feb-10 17:45 
AnswerRe: CRC8-CCITT??? Pin
Rob Magee5-Feb-10 13:06
memberRob Magee5-Feb-10 13:06 
GeneralRe: CRC8-CCITT??? Pin
Mad as a Hatter6-Feb-10 6:03
memberMad as a Hatter6-Feb-10 6:03 
GeneralRe: CRC8-CCITT??? Pin
Rob Magee6-Feb-10 9:32
memberRob Magee6-Feb-10 9:32 
QuestionHow to calculate CRCTable? Pin
Georgi Petrov29-Nov-09 10:41
memberGeorgi Petrov29-Nov-09 10:41 
AnswerRe: How to calculate CRCTable? [modified] Pin
Mad as a Hatter4-Feb-10 17:51
memberMad as a Hatter4-Feb-10 17:51 
QuestionHow the CRC table calculated from ? Pin
whfongs25-Aug-07 16:56
memberwhfongs25-Aug-07 16:56 
GeneralOptimizations Pin
Ri Qen-Sin5-Jun-07 13:15
memberRi Qen-Sin5-Jun-07 13:15 
GeneralRe: Optimizations Pin
Rob Magee6-Jun-07 4:20
memberRob Magee6-Jun-07 4:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.180111.1 | Last Updated 6 Feb 2010
Article Copyright 2007 by Rob Magee
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid