BBS: Inland Empire Archive Date: 09-17-82 (15:22) Number: 241 From: RICH GELDREICH Refer#: NONE To: ALL Recvd: NO Subj: Crc32 Routine in all 2/2 Conf: (2) Quik_Bas
>>> Continued from previous message OPEN FileName$ FOR INPUT AS handle: CLOSE 'check to see if it's there OPEN FileName$ FOR BINARY AS handle 'open file in binary mode B$ = SPACE$(LoadBuffer) 'allocate space for buffer CRC& = &HFFFFFFFF 'init CRC FOR A = 1 TO LOF(handle) \ LoadBuffer 'do the blocks GET handle, , B$ 'get block CRC& = QBCRC(SSEG(B$), SADD(B$), LoadBuffer, CRC&) NEXT whatsleft = LOF(handle) MOD LoadBuffer 'do the oddballs now B$ = SPACE$(whatsleft) 'whatever's left over GET handle, , B$ 'get it CRC& = QBCRC(SSEG(B$), SADD(B$), whatsleft, CRC&) CLOSE handle 'close file FileCRC& = NOT CRC& 'return CRC to caller END FUNCTION 'Uses in-line coding to find a CRC-32 of a block of memory 'Although the "Length" variable is a signed integer, memory blocks >32k 'may be processed by this routine. (To process a block of memory 65535 'bytes long, -1, or &HFFFF, would be passed to this procedure, for 'instance.) ' FUNCTION QBCRC& (BYVAL Segment, BYVAL Offset, BYVAL Length, BYVAL CRC&) 'QB4.5 users : FUNCTION QBCRC& (Segment,Offset,Length,CRC&) 'switch to input segment DEF SEG = Segment 'Since we're going to calculate the CRC 4 bytes at a time, this FOR/NEXT 'takes care of all the oddballs left over... FOR A = 1 TO Length AND 3 CRC& = CRCTable&((CINT(CRC&) AND 255) XOR PEEK(Offset)) XOR _ (((CRC& AND &HFFFFFF00) \ 256) AND &HFFFFFF) Offset = Offset + 1 NEXT 'Adjust length- divide it by 4 using unsigned division Length = ((Length AND &HFFFC) \ 4) AND &H3FFF 'Drop into loop GOTO B 'Updates the CRC on the next 4 bytes, doing this 4 bytes at a time 'results in a small improvement in speed, since the compiled code 'will jump less often... A: CRC& = CRCTable&((CINT(CRC&) AND 255) XOR PEEK(Offset)) _ XOR (((CRC& AND &HFFFFFF00) \ 256) AND &HFFFFFF) CRC& = CRCTable&((CINT(CRC&) AND 255) XOR PEEK(Offset + 1)) _ XOR (((CRC& AND &HFFFFFF00) \ 256) AND &HFFFFFF) CRC& = CRCTable&((CINT(CRC&) AND 255) XOR PEEK(Offset + 2)) _ XOR (((CRC& AND &HFFFFFF00) \ 256) AND &HFFFFFF) CRC& = CRCTable&((CINT(CRC&) AND 255) XOR PEEK(Offset + 3)) _ XOR (((CRC& AND &HFFFFFF00) \ 256) AND &HFFFFFF) Offset = Offset + 4 '4 bytes over now Length = Length - 1 '1 less byte B: IF Length <> 0 THEN GOTO A 'if more bytes then go 'All done QBCRC& = CRC& END FUNCTION --- * SLMR 2.0 * It's a good day to die. ...unless you want to live!(duh) --- MsgToss 2.0b * Origin: Computer Co-Op - Voorhees, NJ | Ted Hare (1:266/29)
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET