CRCチェックアルゴリズムのインスタンス解析
1859 ワード
コンセプト
CRCチェックアルゴリズムは,はっきり言って,チェックが必要なデータを多項式と循環異或(XOR)し,XORを行う方式が実際のデータ伝送時に高位先伝であるか,低位先伝であるかに関係する.データの高位の先伝の方式について、XORはデータの高位から、私达はそれを順番に異或と呼ぶようにしましょう;データの下位の先伝の方式について、XORはデータの下位から、私たちはそれを反序異と呼びましょう.2つの異なる異種または方式は,同じ多項式に対応しても計算結果が異なる.
インスタンス解析
2つの異なるタイプの書き方:
#include
typedef unsigned char uint8_t;
uint8_t gencrc(uint8_t *data, size_t len)
{
uint8_t crc = 0xff;
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if ((crc & 0x80) != 0)
crc = (uint8_t)((crc << 1) ^ 0x31);
else
crc <<= 1;
}
}
return crc;
}
/*
crc8 poly = 0x107 (x8+x2+x1+1)
*/
uint8_t crc8(uint8_t *data, int size)
{
uint8_t crc = 0x00;
uint8_t poly = 0x07;
int bit;
while (size--)
{
crc ^= *data++;
for (bit = 0; bit < 8; bit++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ poly;
}
else
{
crc <<= 1;
}
}
}
return crc;
}
int main()
{
uint8_t data[8] = {0xBE,0xEF,0,0,0,0,0,0};
uint8_t datab[8] = {0xBE,0xEF,2,0,0,0,0,0};
uint8_t crc,crcb;
crc = gencrc(data, 8);
crcb = gencrc(datab, 8);
printf("first crc:
");
printf("crc:0x%1x crcb:0x%x
", crc,crcb);
crc = crc8(data, 8);
crcb = crc8(datab, 8);
printf("second crc:
");
printf("crc:0x%1x crcb:0x%x
", crc,crcb);
crc = gencrc(data+2, 1); /* returns 0xac */
printf("%1x
", crc);
return 0;
}
パラメータが異なる結果:
first crc:
crc:0xc7 crcb:0x69
second crc:
crc:0x83 crcb:0xd1
ac