I got this class to compute the CRC8 checksum of a byte[]:
public static class Crc8 { static byte[] table = new byte[256]; // x8 + x7 + x6 + x4 + x2 + 1 const byte poly = 0xd5; public static byte ComputeChecksum(params byte[] bytes) { byte crc = 0; if (bytes != null && bytes.Length > 0) { foreach (byte b in bytes) { crc = table[crc ^ b]; } } return crc; } static Crc8() { for (int i = 0; i < 256; ++i) { int temp = i; for (int j = 0; j < 8; ++j) { if ((temp & 0x80) != 0) { temp = (temp << 1) ^ poly; } else { temp <<= 1; } } table[i] = (byte)temp; } } } And in the Main I got:
static void Main(string[] args) { string number = "123456789"; Console.WriteLine(Convert.ToByte(Crc8.ComputeChecksum(StringToByteArray(number))).ToString("x2")); Console.ReadLine(); } private static byte[] StringToByteArray(string str) { ASCIIEncoding enc = new ASCIIEncoding(); return enc.GetBytes(str); } This results in 0xBC
However, according to: this is incorrect, because the checksum for the CheckSum8 Xor is 0x31.
What did I wrong there?
2 Answers
On the linked site only some 16 and 32 bit CRCs are listed, the CheckSum8Xor is not a CRC. The 0xBC comes from a 8-bit CRC called "CRC-8/DVB-S2", see
1Ah, ok, so I've overiterpreted this checksum computation.
Well, in that case, it's easy:
public static byte Checksum8XOR(byte[] data) { byte checksum = 0x00; for (int i = 0; i < data.Length; i++) { checksum ^= data[i]; } return checksum; }