我得到这个类来计算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。
我在那里错了什么?
答案 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;
}