GLBasic forum

Codesnippets => Math => Topic started by: MrTAToad on 2009-Feb-07

Title: CRC 32
Post by: MrTAToad on 2009-Feb-07
This calculates a CRC 32 bit value for a value.  It can also do it from a file.  Note that the file version is rather slow - to speed it up, a buffer is needed (in my original DBPro version I used 1 Mb buffer).

The test program :

Code (glbasic) Select
DEBUG "Result : "+calcCRC32(13,16)+"\n"
DEBUG "File Result : "+calcCRC32FromFile("C:/Documents AND Settings/Nicholas/My Documents/GLBasic/TestInline/Inline.gbas")


The CRC code :

Code (glbasic) Select
// --------------------------------- //
// Project: TestInline
// Start: Saturday, February 07, 2009
// IDE Version: 6.156

FUNCTION dummy:
ENDFUNCTION

INLINE
}
unsigned long CRC[]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};

namespace __GLBASIC__ {
ENDINLINE

FUNCTION calcCRC32%:byte%,crc%
INLINE
return (DGNat) (CRC[(unsigned char) (crc^(unsigned long) byte)]^((crc<<8) & 0x00FFFFFF));
ENDINLINE
ENDFUNCTION

FUNCTION calcCRC32End%:crc%
INLINE
return (DGNat) (crc^0xFFFFFFFF);
ENDINLINE
ENDFUNCTION

FUNCTION calcCRC32FromFile%:fileName$
LOCAL crc%
LOCAL handle% = 1
LOCAL one%

DEBUG fileName$+"\n"
IF OPENFILE(handle%,fileName$,TRUE)=TRUE
READBYTE handle%,one%
WHILE ENDOFFILE(handle%)=FALSE
crc%=calcCRC32( one,crc%)
READBYTE handle%,one%
WEND

crc%=calcCRC32End(crc%)
CLOSEFILE handle%

RETURN crc%
ENDIF
ENDFUNCTION
Title: Re: CRC 32
Post by: MrTAToad on 2009-Feb-09
I would make sure you use a file buffer (and thus slightly change the loading system) if you want to calculate the value by reading a file.
Title: Re: CRC 32
Post by: WPShadow on 2009-Feb-09
It's really great, because I can use it for my game!  :whistle:
Title: Re: CRC 32
Post by: MrTAToad on 2009-Feb-10
It has a 101 uses :)
Title: Re: CRC 32
Post by: Albert on 2011-Jan-27
Hi!
I'm tried your crc32() from the wiki, but it generates wrong values for me.
I made a file, and put a "b" into it.
Your script gives me 0x5C43FF8B but 0x71BEEFF9 expected.
Title: Re: CRC 32
Post by: Moru on 2011-Jan-27
It's hard to say what to expect from a CRC32 because there are a number of different ways of doing it. You have to find the correct algorithm for your expected result.
Title: Re: CRC 32
Post by: MrTAToad on 2011-Jan-29
Assuming its the same code as above, it generates exactly the right values for the routine.  Your checking CRC routine may have different starting hash values.

Someone else did try to suggest the returned value is incorrect, but after a lengthy discussion, we both agreed I was correct.
Title: Re: CRC 32
Post by: Albert on 2011-Jan-29
Ah I see. Meanwhile I wrote my own, may I submit here?
Title: Re: CRC 32
Post by: MrTAToad on 2011-Jan-30
Yes, if you want to.
Title: Re: CRC 32
Post by: Moru on 2011-Mar-27
Quote from: Albert on 2011-Jan-29
Ah I see. Meanwhile I wrote my own, may I submit here?

Hello Albert, I'm still waiting for you to submit your crc32 routine :-)
Title: Re: CRC 32
Post by: Albert on 2011-Mar-29
It's a little mess, but I will tidy up then soon.
Title: Re: CRC 32
Post by: Moru on 2011-Mar-29
Great, looking forward to it