Incorrect CRC8 checksum computation

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

1

Ah, 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; } 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like