Guidance
指路人
g.yi.org
Software / Reginald / Examples / checksum.rex

Register 
新用户注册
Search 搜索
首页 
Home Home
Software
Upload

  
OPTIONS "C_CALL NOSOURCE LABELCHECK"

filename = "Checksum.rex"
initcrc32()
SAY crc32disk(filename, '00000000', 'FFFFFFFF')
RETURN



/* *********************** Crc32Disk **********************
 * Calculates and returns a 32-bit CRC checksum on the
 * specified file.
 *
 * checksum = Crc32Disk(filename, start, end)
 *
 * filename = The name of the file to checksum.
 * start = The offset to start calculating the checksum.
 *         This is expressed in hex notation, such as
 *         '00000000' to start at the first byte.
 * stop =  The offset at which to stop the calculation.
 */

crc32disk: PROCEDURE EXPOSE crc32table
USE ARG fname
NUMERIC DIGITS 11
checksum = "FFFFFFFF"x

DO
	/* Open the file */
	STREAM(fname, 'C', 'OPEN READ')

	/* Get the size */
	total = CHARS(fname)

	/* Anything to checksum? */
	IF total > 0 THEN DO

		/* Get the start address. It's expressed in hex notation, so convert to decimal */
		start = X2D(ARG(2))

		/* Get the end address. It's expressed in hex notation, so convert to decimal */
		stop = X2D(ARG(3))
		IF stop > total THEN stop = total

		IF start >= total THEN
			SAY "Checksum can't be calculated."
		ELSE DO

	
			/* Seek to that position in the file */
			IF start \== 0 THEN STREAM(fname, 'C', 'SEEK =' || start 'READ CHAR')

			/* We're going to read the file in 2048 byte chunks. The last chunk
			 * we read in may have less than 2048 bytes. We'll handle this separately.
			 */
 			DO TRUNC((stop - start) / 2048)

				/* Read the next 2048 byte chunk */
				data = CHARIN(fname, , 2048)

				/* Checksum this chunk */
				DO i = 1 TO 2048
					checksum =  BITXOR(SUBSTR(crc32table, (VALUEIN(BITXOR(checksum, "000000"x || SUBSTR(data, i, 1)), 4, 1, 'V') * 4) + 1, 4), "00"x || LEFT(checksum, 3))
				END

			END /* Handle the 2048 byte chunks */

			/* Now we have to handle the last chunk. Read it in */
			start = (stop - start) // 2048 /* How many bytes we have left */
			data = CHARIN(fname, , start)

			/* Checksum the last chunk */
			DO i = 1 TO start
				checksum =  BITXOR(SUBSTR(crc32table, (VALUEIN(BITXOR(checksum, "000000"x || SUBSTR(data, i, 1)), 4, 1, 'V') * 4) + 1, 4), "00"x || LEFT(checksum, 3))
			END
		END
	END /* total > 0 */

	CATCH NOTREADY
	   SAY STREAM(fname, 'D')

	FINALLY
		STREAM(fname, "C", "CLOSE")
END
RETURN C2X(BITXOR(checksum, "FFFFFFFF"x))


/* ******************** InitCrc32() ***********************
 * Must be called once at the start of your script, and
 * then you can call Crc32().
 */

initcrc32:
crc32table = "00000000 77073096 ee0e612c 990951ba 076dc419"x ||,
"706af48f e963a535 9e6495a3 0edb8832 79dcb8a4"x ||,
"e0d5e91e 97d2d988 09b64c2b 7eb17cbd e7b82d07"x ||,
"90bf1d91 1db71064 6ab020f2 f3b97148 84be41de"x ||,
"1adad47d 6ddde4eb f4d4b551 83d385c7 136c9856"x ||,
"646ba8c0 fd62f97a 8a65c9ec 14015c4f 63066cd9"x ||,
"fa0f3d63 8d080df5 3b6e20c8 4c69105e d56041e4"x ||,
"a2677172 3c03e4d1 4b04d447 d20d85fd a50ab56b"x ||,
"35b5a8fa 42b2986c dbbbc9d6 acbcf940 32d86ce3"x ||,
"45df5c75 dcd60dcf abd13d59 26d930ac 51de003a"x ||,
"c8d75180 bfd06116 21b4f4b5 56b3c423 cfba9599"x ||,
"b8bda50f 2802b89e 5f058808 c60cd9b2 b10be924"x ||,
"2f6f7c87 58684c11 c1611dab b6662d3d 76dc4190"x ||,
"01db7106 98d220bc efd5102a 71b18589 06b6b51f"x ||,
"9fbfe4a5 e8b8d433 7807c9a2 0f00f934 9609a88e"x ||,
"e10e9818 7f6a0dbb 086d3d2d 91646c97 e6635c01"x ||,
"6b6b51f4 1c6c6162 856530d8 f262004e 6c0695ed"x ||,
"1b01a57b 8208f4c1 f50fc457 65b0d9c6 12b7e950"x ||,
"8bbeb8ea fcb9887c 62dd1ddf 15da2d49 8cd37cf3"x ||,
"fbd44c65 4db26158 3ab551ce a3bc0074 d4bb30e2"x ||,
"4adfa541 3dd895d7 a4d1c46d d3d6f4fb 4369e96a"x ||,
"346ed9fc ad678846 da60b8d0 44042d73 33031de5"x ||,
"aa0a4c5f dd0d7cc9 5005713c 270241aa be0b1010"x ||,
"c90c2086 5768b525 206f85b3 b966d409 ce61e49f"x ||,
"5edef90e 29d9c998 b0d09822 c7d7a8b4 59b33d17"x ||,
"2eb40d81 b7bd5c3b c0ba6cad edb88320 9abfb3b6"x ||,
"03b6e20c 74b1d29a ead54739 9dd277af 04db2615"x ||,
"73dc1683 e3630b12 94643b84 0d6d6a3e 7a6a5aa8"x ||,
"e40ecf0b 9309ff9d 0a00ae27 7d079eb1 f00f9344"x ||,
"8708a3d2 1e01f268 6906c2fe f762575d 806567cb"x ||,
"196c3671 6e6b06e7 fed41b76 89d32be0 10da7a5a"x ||,
"67dd4acc f9b9df6f 8ebeeff9 17b7be43 60b08ed5"x ||,
"d6d6a3e8 a1d1937e 38d8c2c4 4fdff252 d1bb67f1"x ||,
"a6bc5767 3fb506dd 48b2364b d80d2bda af0a1b4c"x ||,
"36034af6 41047a60 df60efc3 a867df55 316e8eef"x ||,
"4669be79 cb61b38c bc66831a 256fd2a0 5268e236"x ||,
"cc0c7795 bb0b4703 220216b9 5505262f c5ba3bbe"x ||,
"b2bd0b28 2bb45a92 5cb36a04 c2d7ffa7 b5d0cf31"x ||,
"2cd99e8b 5bdeae1d 9b64c2b0 ec63f226 756aa39c"x ||,
"026d930a 9c0906a9 eb0e363f 72076785 05005713"x ||,
"95bf4a82 e2b87a14 7bb12bae 0cb61b38 92d28e9b"x ||,
"e5d5be0d 7cdcefb7 0bdbdf21 86d3d2d4 f1d4e242"x ||,
"68ddb3f8 1fda836e 81be16cd f6b9265b 6fb077e1"x ||,
"18b74777 88085ae6 ff0f6a70 66063bca 11010b5c"x ||,
"8f659eff f862ae69 616bffd3 166ccf45 a00ae278"x ||,
"d70dd2ee 4e048354 3903b3c2 a7672661 d06016f7"x ||,
"4969474d 3e6e77db aed16a4a d9d65adc 40df0b66"x ||,
"37d83bf0 a9bcae53 debb9ec5 47b2cf7f 30b5ffe9"x ||,
"bdbdf21c cabac28a 53b39330 24b4a3a6 bad03605"x ||,
"cdd70693 54de5729 23d967bf b3667a2e c4614ab8"x ||,
"5d681b02 2a6f2b94 b40bbe37 c30c8ea1 5a05df1b"x ||,
"2d02ef8d"x
RETURN
掌柜推荐
 
 
 
 
 
 
 
 
 
 
 
 
© Fri 2017-6-23  Guidance Laboratory Inc.
Email:webmaster1g.yi.org Hits:0 Last modified:2010-07-16 20:46:01