Corrections of CRC-32 algorithm for 32 bit systems. Mentioning of start value.

This commit is contained in:
Thomas Schmitt 2012-05-08 08:04:13 +00:00
parent 85820e9fc0
commit 6956a3b3d3
2 changed files with 17 additions and 4 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.04.13.202654" #define Cdrskin_timestamP "2012.05.08.080449"

View File

@ -130,6 +130,16 @@
And this is what function crc_ccitt() does, modulo swapping the exor And this is what function crc_ccitt() does, modulo swapping the exor
operants and the final bit inversion which is prescribed by ECMA-130 operants and the final bit inversion which is prescribed by ECMA-130
and MMC-3 Annex J. and MMC-3 Annex J.
The start value of the table driven byte shifting algorithm may be
different from the start value of an equivalent bit shifting algorithm.
This is because the final flushing by zero bits is already pre-computed
in the table. So the start value of the table driven algorithm must be
the CRC of the 0-polynomial under the start value of the bit shifting
algorithm.
This fact is not of much importance here, because the start value of
the bit shifter is 0x0000 which leads to CRC 0x0000 and thus to start
value 0x0000 with the table driven byte shifter.
*/ */
@ -312,7 +322,7 @@ unsigned int rfl32(unsigned int acc)
*/ */
static unsigned int crc_18001801b(unsigned char *data, int count, int flag) static unsigned int crc_18001801b(unsigned char *data, int count, int flag)
{ {
unsigned long int acc = 0, top; unsigned int acc = 0, top;
long int i; long int i;
unsigned int inv_acc; unsigned int inv_acc;
@ -328,11 +338,11 @@ static unsigned int crc_18001801b(unsigned char *data, int count, int flag)
acc |= ((data[i / 8] >> (i % 8)) & 1); acc |= ((data[i / 8] >> (i % 8)) & 1);
} }
if (top) if (top)
acc ^= 0x18001801b; acc ^= 0x8001801b;
} }
if (flag & 1) if (flag & 1)
return (unsigned int) acc; return (unsigned int) (acc & 0xffffffff);
/* The bits of the whole 32 bit result are mirrored for ECMA-130 /* The bits of the whole 32 bit result are mirrored for ECMA-130
output compliance and for sector.c habit to store CRC little endian output compliance and for sector.c habit to store CRC little endian
@ -387,6 +397,9 @@ static unsigned int crc_18001801b(unsigned char *data, int count, int flag)
rfl8() can be implemented as lookup table. rfl8() can be implemented as lookup table.
The start value of the bit shifting iteration is 0x00000000, which leads
to the same start value for the table driven byte shifting.
The following function crc32_by_tab() yields the same results as functions The following function crc32_by_tab() yields the same results as functions
crc_18001801b() and crc_32(): crc_18001801b() and crc_32():