Page 1 of 1

CRC-16 CCITT calculation (8408H polynom)

Posted: Mon Sep 30, 2013 8:09 am
by Alexander Shiryaev

Code: Select all

MODULE CRC16CCITT8408;

    (*
        A. V. Shiryaev, 2013.09

        http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
    *)

    IMPORT SYSTEM;

    CONST
        init* = 0FFFFH;

    (*
        Name: CRC-16 CCITT
        Poly: $8408
        Init: $FFFF
        Revert: FALSE
        XorOut: $0000
        Check: $6F91 ("123456789")
        MaxLen: 4095 bytes (32767 bits) --- detection of single, double, triple, and all odd errors
    *)
    PROCEDURE* Update* (VAR cs: INTEGER; x: CHAR);
    BEGIN
        (* ASSERT 0 <= cs <= 0FFFFH *)
        x := CHR(SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, ORD(x)) / SYSTEM.VAL(SET, cs MOD 100H)));
        x := CHR(SYSTEM.VAL(INTEGER, SYSTEM.VAL(SET, ORD(x)) / SYSTEM.VAL(SET, ORD(x) * 16)));
        cs := SYSTEM.VAL(INTEGER,
            ( SYSTEM.VAL(SET, ORD(x) * 100H) + SYSTEM.VAL(SET, cs DIV 100H) )
            / SYSTEM.VAL(SET, ORD(x) DIV 16) / SYSTEM.VAL(SET, ORD(x) * 8)
        )
    END Update;

(* BEGIN ASSERT(LEN(CHAR) = 1); ASSERT(LEN(INTEGER) >= 4); ASSERT(LEN(SET >= 4)) *)
END CRC16CCITT8408.