IDENTIFICATION DIVISION.
PROGRAM-ID. CALCULATE-CRC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-STRING PIC X(100).
01 CRC-VALUE PIC X(4) VALUE X'FFFF'.
01 CRC-POLYNOMIAL PIC X(2) VALUE X'1021'.
01 BYTE-COUNT PIC 9(4) COMP VALUE 0.
01 BYTE-INDEX PIC 9(4) COMP VALUE 1.
PROCEDURE DIVISION.
MAIN-LOGIC.
MOVE "00020101021141420017ar.com.bancoroela98113059891004599020150150011200837428105126002200222470005610000000585204472253030325802AR5914TURISMO ANIBUS608SANTA FE6108S2600IKP62830032fc751fa68bc4473aac2be9dda9afa91e01200000000000000034780106190000000000000004722807600329332b32784bf45859ecbfa1ce17e19ca011424041524100.5002100826015.2703100829714.346304"
TO INPUT-STRING.
MOVE LENGTH OF INPUT-STRING TO BYTE-COUNT.
PERFORM CALCULATE-CRC-LOOP UNTIL BYTE-INDEX > BYTE-COUNT.
DISPLAY "CRC: " CRC-VALUE.
STOP RUN.
CALCULATE-CRC-LOOP.
MOVE BYTE-COUNT TO BYTE-INDEX.
PERFORM CALCULATE-CRC-BYTE.
ADD 1 TO BYTE-INDEX.
CALCULATE-CRC-BYTE.
MOVE BYTE-INDEX TO CRC-INDEX.
PERFORM CALCULATE-CRC-BIT 8 TIMES.
CALCULATE-CRC-BIT.
IF CRC-VALUE BIT AND 1 = 1
XOR CRC-POLYNOMIAL WITH CRC-VALUE
END-IF.
SHIFT RIGHT 1 PLACES IN CRC-VALUE.
IF BIT-COUNT > 0
SHIFT LEFT 1 PLACES IN CRC-VALUE
END-IF.
SUBTRACT 1 FROM BIT-COUNT.