Author Topic: CRC 32  (Read 6501 times)

MrTAToad

  • Guest
CRC 32
« 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

MrTAToad

  • Guest
Re: CRC 32
« Reply #1 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.

Offline WPShadow

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1667
    • View Profile
    • http://lostrevenant.blogspot.com
Re: CRC 32
« Reply #2 on: 2009-Feb-09 »
It's really great, because I can use it for my game!  :whistle:
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

MrTAToad

  • Guest
Re: CRC 32
« Reply #3 on: 2009-Feb-10 »
It has a 101 uses :)

Offline Albert

  • Dr. Type
  • ****
  • Posts: 257
    • View Profile
    • Blog
Re: CRC 32
« Reply #4 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.

Offline Moru

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1774
    • View Profile
    • Homepage
Re: CRC 32
« Reply #5 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.

MrTAToad

  • Guest
Re: CRC 32
« Reply #6 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.
« Last Edit: 2011-Jan-29 by MrTAToad »

Offline Albert

  • Dr. Type
  • ****
  • Posts: 257
    • View Profile
    • Blog
Re: CRC 32
« Reply #7 on: 2011-Jan-29 »
Ah I see. Meanwhile I wrote my own, may I submit here?

MrTAToad

  • Guest
Re: CRC 32
« Reply #8 on: 2011-Jan-30 »
Yes, if you want to.

Offline Moru

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1774
    • View Profile
    • Homepage
Re: CRC 32
« Reply #9 on: 2011-Mar-27 »
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 :-)

Offline Albert

  • Dr. Type
  • ****
  • Posts: 257
    • View Profile
    • Blog
Re: CRC 32
« Reply #10 on: 2011-Mar-29 »
It's a little mess, but I will tidy up then soon.

Offline Moru

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1774
    • View Profile
    • Homepage
Re: CRC 32
« Reply #11 on: 2011-Mar-29 »
Great, looking forward to it