CRC8校验和计算不正确

时间:2017-06-26 19:49:34

标签: c# checksum crc

我得到这个类来计算byte []的CRC8校验和:

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

在Main我得到了:

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);
}

这导致0xBC

然而,根据:http://www.scadacore.com/field-tools/programming-calculators/online-checksum-calculator/ 这是不正确的,因为CheckSum8 Xor的校验和是0x31。

我在那里错了什么?

2 个答案:

答案 0 :(得分:1)

在链接的站点上只列出了一些16位和32位的CRC CheckSum8Xor CRC。 0xBC 来自8位CRC 称为“CRC-8 / DVB-S2”,见http://reveng.sourceforge.net/crc-catalogue/1-15.htm

答案 1 :(得分:0)

啊,好的,所以我过度推测了这个校验和计算。

嗯,在这种情况下,这很简单:

public static byte Checksum8XOR(byte[] data)
        {
            byte checksum = 0x00;

            for (int i = 0; i < data.Length; i++)
            {

                checksum ^= data[i];

            }


            return checksum;
        }