CRC16 - Polynom 0x8005

Relevant links:
http://www.summitinstruments.com/knowledge_center/pdf/TN410.pdf
http://www.lammertbies.nl/comm/info/crc-calculation.html?crc=1234567898765421&method=ascii


$SAMPLECODE$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

* The code below seems to produce correct result but it hasn't been tested thoroughly. 
* Polynom = 0x8005
#DEFINE CRC16 0xA001

* Build CRC table
DIMENSION laCrc[256]

FOR i=0 TO 255

	lnData = i
	lnCrc = 0
	FOR j=0 TO 7
		IF BITAND(BITXOR(lnData, lnCrc),1) > 0
			lnCrc = BITXOR(BITRSHIFT(lnCrc,1), CRC16)
		ELSE
			lnCrc = BITRSHIFT(lnCrc,1)
		ENDIF

		lnData = BITRSHIFT(lnData,1)

	ENDFOR

	*? i, TRANSFORM(lnCrc, "@0")
	laCrc[i+1] = lnCrc
ENDFOR

* Calculate CRC16
lcStr = "1234567898765421"

lnCrc = 0
FOR i=1 TO LEN(lcStr)
	lnByte = ASC(SUBSTR(lcStr,i,1))
	lnCrc = BITXOR( BITRSHIFT(lnCrc,8), ;
				laCrc[BITXOR(BITAND(lnCrc, 0xFF), lnByte)+1])
ENDFOR
? TRANSFORM(lnCrc, "@0")

Comments