C# CRC8
C# /// /// This enum is used to indicate what kind of checksum you will be calculating. /// public enum CRC8_POLY { CRC8 = 0xd5, CRC8_CCITT = 0x07, CRC8_DALLAS_MAXIM = 0x31, 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 { get { return this.table; } set { 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; } else { curr <<= 1; } } csTable[i] = (byte)curr; } return csTable; } public CRC8Calc(CRC8_POLY polynomial) { this.table = this.GenerateTable(polynomial); } } Example C# 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); WL(checksum); CRC8Calc crc = new CRC8Calc(CRC8_POLY.CRC8_CCITT); checksum = crc.Checksum(testVal); WL(checksum); } #region Helper methods public static void Main() { try { RunSnippet(); } catch (Exception e) { string error = string.Format ("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString()); Console.WriteLine(error); } finally { Console.Write("Press any key to continue..."); Console.ReadKey(); } } private static void WL(object text, params object[] args) { Console.WriteLine(text.ToString(), args); } #endregion }