From: Michael N. <mi...@na...> - 2002-11-14 13:21:18
|
Peter, It looks like you are using a different polynomial. Does your code work with the CCITT polynomial, 104C11DB7? Mike At 12:32 PM 11/14/2002 +0000, Peter B Clements wrote: >Hello Michael, > >On Thursday, November 14, 2002, 3:33:25 AM, you wrote: > >MN> At 11:44 PM 11/13/2002 +0100, michael Minault wrote: > >>Some minor remark about the spec. : > >> > >>The spec. doesn't say anything about the CRC32 parameters chosen. > >>All implementations of CRC32 i know uses the same parameters as the > >>Ethernet CRC32 implementation, so I guess it's the same in PAR2, but it > >>could be a good thing to state it explicitly in the spec. > >>There is a very good article about CRC code at > >><http://www.ross.net/crc/crcpaper.html>http://www.ross.net/crc/crcpaper. > html > >>and a list of well known CRC parameters at > >><http://www.repairfaq.org/filipg/LINK/F_crc_v35.html#CRCV_001>http://www > .repairfaq.org/filipg/LINK/F_crc_v35.html#CRCV_001 > >>(including Ethernet CRC32) > >> > >>michael > >Those links make interesting reading. > >MN> Thanks Michael. I'll make sure that gets into the final version of the >MN> spec. > >MN> I knew there were many 32-bit CRCs and I thought that CRC32 was a "name >MN> brand" one. I should know better by now to check the facts. I'll make >MN> sure I specify it is the 32-bit CRC specified by CCITT. (This is how >it is >MN> identified in the 802.11 spec.) I pasted the polynomial below. > >MN> Thanks again, >MN> Mike > >MN> G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + >x4 + >MN> x2 + x + 1 > >The code I use for CRC32 is derived from the following: > >#define CRC32_POLYNOMIAL 0xEDB88320L > >unsigned long ccitt_32[256]; > >void build_table_32(void) >{ > unsigned int i; > unsigned int j; > unsigned long crc; > > for ( i = 0; i <= 255 ; i++ ) > { > crc = i; > for ( j = 0 ; j < 8; j++ ) > { > crc = ( crc >> 1 ) ^ (( crc & 1 ) ? CRC32_POLYNOMIAL : 0 ); > } > ccitt_32[ i ] = crc; > } >} > >unsigned long UpdateCRC32(unsigned long crc, > unsigned int count, > const unsigned char *buffer) >{ > const unsigned char *p = buffer; > unsigned long temp1; > unsigned long temp2; > > while ( count-- != 0 ) > { > temp1 = ( crc >> 8 ) & 0x00FFFFFFL); > temp2 = ccitt_32[ ( (int) crc ^ *p++ ) & 0xff ]; > crc = temp1 ^ temp2; > } > return( crc ); >} > >main() >{ > // Calculate the CRC of two blocks of data > // joined end to end. > unsigned char text1[] = "whatever"; > unsigned char text2[] = "next"; > > // Do the first block of data and start with a CRC of 0xFFFFFFFF. > unsigned long crc = UpdateCRC32(~0, strlen(text1), text1); > > // Do the second block and apply post conditioning to get > // the final CRC value. > crc = ~0 ^ UpdateCRC32(crc, strlen(text2), text2)); >} > >I assume this algorithm is what everyone else is using in their PAR2 code. > >-- >Best regards, > Peter mailto:pe...@sh... > > > >------------------------------------------------------- >This sf.net email is sponsored by: To learn the basics of securing >your web site with SSL, click here to get a FREE TRIAL of a Thawte >Server Certificate: http://www.gothawte.com/rd524.html >_______________________________________________ >Parchive-devel mailing list >Par...@li... >https://lists.sourceforge.net/lists/listinfo/parchive-devel |