📄 crc.c
字号:
===========================================================================*/
word crc_16_l_calc
(
byte *buf_ptr,
/* Pointer to bytes containing the data to CRC. The bit stream starts
** in the LS bit of the first byte.
*/
word len
/* Number of data bits to calculate the CRC over */
)
{
word data, crc_16;
/* Generate a CRC-16 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
*/
for (crc_16 = CRC_16_L_SEED ; len >= 8; len -= 8, buf_ptr++) {
crc_16 = crc_16_l_table[ (crc_16 ^ *buf_ptr) & 0x00ff ] ^ (crc_16 >> 8);
}
/* Finish calculating the CRC over the trailing data bits
**
** XOR the MS bit of data with the MS bit of the CRC.
** Shift the CRC and data left 1 bit.
** If the XOR result is 1, XOR the generating polynomial in with the CRC.
*/
if (len != 0) {
data = ((word) (*buf_ptr)) << (16-8); /* Align data MSB with CRC MSB */
while (len-- != 0) {
if ( ((crc_16 ^ data) & 0x01) != 0 ){ /* Is LSB of XOR a 1 */
crc_16 >>= 1; /* Right shift CRC */
crc_16 ^= CRC_16_L_POLYNOMIAL; /* XOR polynomial into CRC */
} else {
crc_16 >>= 1; /* Right shift CRC */
}
data >>= 1; /* Right shift data */
}
}
return( ~crc_16 ); /* return the 1's complement of the CRC */
} /* end of crc_16_l_calc */
/*===========================================================================
FUNCTION CRC_30_CALC
DESCRIPTION
This function calculates a 30-bit CRC over a specified number of data
bits. It can be used to produce a CRC and to check a CRC.
DEPENDENCIES
None
RETURN VALUE
Returns a double word holding 30 bits which are the contents of the
CRC register as calculated over the specified data bits. If this
function is being used to check a CRC, then the return value will be
equal to CRC_30_OK (defined in crc.h) if the CRC checks correctly.
SIDE EFFECTS
None
===========================================================================*/
dword crc_30_calc
(
byte *buf_ptr,
/* Pointer to bytes containing the data to CRC. The bit stream starts
** in the MS bit of the first byte.
*/
word len
/* Number of data bits to calculate the CRC over */
)
{
dword data, crc_30;
/* Generate a CRC-30 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
*/
for (crc_30 = CRC_30_SEED ; len >= 8; len -= 8, buf_ptr++) {
crc_30 = crc30_table[ ((crc_30 >> (30 - 8)) ^ *buf_ptr) & 0xff ]
^ (crc_30 << 8);
}
/* Finish calculating the CRC over the trailing data bits
**
** XOR the MS bit of data with the MS bit of the CRC.
** Shift the CRC and data left 1 bit.
** If the XOR result is 1, XOR the generating polynomial in with the CRC.
*/
if (len != 0) {
data = ((dword) (*buf_ptr)) << (30-8); /* Align data MSB with CRC MSB */
while (len-- != 0) {
if ( ((crc_30 ^ data) & (1L << 29)) != 0 ) { /* Is MSB of XOR a 1 */
crc_30 <<= 1; /* Left shift CRC */
crc_30 ^= CRC_30_POLYNOMIAL; /* XOR polynomial into CRC */
} else {
crc_30 <<= 1; /* Left shift CRC */
}
data <<= 1; /* Left shift data */
}
}
crc_30 = ~crc_30; /* 1's complement the CRC */
return( crc_30 & 0x3FFFFFFF ); /* mask the result to 30 bits */
} /* end of crc_30_calc */
/*===========================================================================
FUNCTION CRC_30_STEP
DESCRIPTION
This function calculates a 30-bit CRC over a specified number of data
bits. It can be used to produce a CRC and to check a CRC. The CRC value
passed in is used to continue the CRC calculation from a previous call,
this allows this routine to be used to CRC discontinuous data.
DEPENDENCIES
None
RETURN VALUE
Returns a double word holding 30 bits which are the contents of the
CRC register as calculated over the specified data bits. If this
function is being used to check a CRC, then the return value will be
equal to CRC_30_OK (defined in crc.h) if the CRC checks correctly.
NOTE: The caller is expected to mask the bottom 30 bits from the value,
SIDE EFFECTS
None
===========================================================================*/
dword crc_30_step
(
dword seed,
/* Either the result of a previous crc_30_step() or CRC_16_STEP_SEED
** the first time the routine is called. Note that the input is
** inverted prior to use, to counteract the inversion applied when
** it was returned as a result of the previous step.
*/
byte *buf_ptr,
/* Pointer to bytes containing the data to CRC. The bit stream starts
** in the MS bit of the first byte.
*/
word len
/* Number of data bits to calculate the CRC over */
)
{
dword data, crc_30;
/* Generate a CRC-30 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
*/
for (crc_30 = ~seed & 0x3FFFFFFF; len >= 8; len -= 8, buf_ptr++) {
crc_30 = crc30_table[ ((crc_30 >> (30 - 8)) ^ *buf_ptr) & 0xff ]
^ (crc_30 << 8);
}
/* Finish calculating the CRC over the trailing data bits
**
** XOR the MS bit of data with the MS bit of the CRC.
** Shift the CRC and data left 1 bit.
** If the XOR result is 1, XOR the generating polynomial in with the CRC.
*/
if (len != 0) {
data = ((dword) (*buf_ptr)) << (30-8); /* Align data MSB with CRC MSB */
while (len-- != 0) {
if ( ((crc_30 ^ data) & (1L << 29)) != 0 ) { /* Is MSB of XOR a 1 */
crc_30 <<= 1; /* Left shift CRC */
crc_30 ^= CRC_30_POLYNOMIAL; /* XOR polynomial into CRC */
} else {
crc_30 <<= 1; /* Left shift CRC */
}
data <<= 1; /* Left shift data */
}
}
crc_30 = ~crc_30; /* 1's complement the CRC */
return( crc_30 & 0x3FFFFFFF ); /* mask the result to 30 bits */
} /* end of crc_30_calc */
/*===========================================================================
FUNCTION CRC_16_STEP
DESCRIPTION
This function calculates a 16-bit CRC over a specified number of data
bytes. It can be used to produce a CRC and to check a CRC. The CRC value
passed in is used to continue the CRC calculation from a previous call;
this allows this routine to be used to CRC discontinuous data.
DEPENDENCIES
None
RETURN VALUE
Returns a word holding 16 bits which are the contents of the CRC
register as calculated over the specified data bits. If this
function is being used to check a CRC, then the return value will be
equal to CRC_16_OK (defined in crc.h) if the CRC checks correctly.
SIDE EFFECTS
None
===========================================================================*/
word crc_16_step
(
word seed,
/* Either the result of a previous crc_16_step() or CRC_16_STEP_SEED
** the first time the routine is called. Note that the input is
** inverted prior to use, to counteract the inversion applied when
** it was returned as a result of the previous step.
*/
byte *buf_ptr,
/* Pointer to bytes containing the data to CRC. The bit stream starts
** in the MS bit of the first byte.
*/
word byte_len
/* Number of data bytes to calculate the CRC over */
)
{
word crc_16;
/* Generate a CRC-16 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
**
** Note: complement the seed to account for it having been complemented
** in a previous call to crc_16_step().
*/
for (crc_16 = ~seed ; byte_len > 0; byte_len--, buf_ptr++) {
crc_16 = (word)(crc16_table[ (crc_16 >> (16 - 8)) ^ *buf_ptr ] ^ (crc_16 << 8));
}
return( ~crc_16 ); /* return the 1's complement of the CRC */
} /* end of crc_16_step */
/*===========================================================================
FUNCTION CRC_16_L_STEP
DESCRIPTION
This function calculates a LSB-first 16-bit CRC over a specified number
of data bytes. It can be used to produce a CRC and to check a CRC.
The CRC value passed in is used to continue the CRC calculation from a
previous call; this allows this routine to be used to CRC discontinuous data.
DEPENDENCIES
None
RETURN VALUE
Returns a word holding 16 bits which are the contents of the CRC
register as calculated over the specified data bits. If this
function is being used to check a CRC, then the return value will be
equal to CRC_16_OK (defined in crc.h) if the CRC checks correctly.
SIDE EFFECTS
None
===========================================================================*/
word crc_16_l_step
(
word seed,
const void *buf_ptr,
/* Either the result of a previous crc_16_l_step() or CRC_16_L_STEP_SEED
** the first time the routine is called. Note that the input is
** inverted prior to use, to counteract the inversion applied when
** it was returned as a result of the previous step.
*/
unsigned int byte_len
/* Number of data bytes to calculate the CRC over */
)
{
word crc_16;
byte *byte_ptr = (byte *) buf_ptr;
/* Generate a CRC-16 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
*/
for (crc_16 = ~seed ; byte_len > 0; byte_len--, byte_ptr++) {
crc_16 = crc_16_l_table[ (crc_16 ^ *byte_ptr) & 0x00ff ] ^ (crc_16 >> 8);
}
return( ~crc_16 ); /* return the 1's complement of the CRC */
} /* end of crc_16_l_step */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -