{{pfw:banner.png}}
==== CRC, 32bit IEEE CRC ====
The IEEE 32bit CRC standard was introduced for the ethernet protocol. The essential difference with previous CRC-implementations was that the start-number is 0xFFFFFFFF instead of 0x0. The reason is that a network can easily start with a couple of spurious 0x0's. A CRC with a 0x0 as start-number cannot detect such a network-specific error. By having 0xFFFFFFFF as start number, the first 4 characters received are effectively inverted. And that enables the detection of spurious zero's at the start of a transmission.
This CRC version is probably the most widely used CRC-version there is. Examples where it is used: ethernet protocol, PKZIP, Gzip, MPEG-2, SATA, PNG, ZMODEM.
If you look at the implementation below you will see that the CRC is shifted to right and that the polynomial of the CRC-IEEE has been reversed. This avoids having to bit-reverse every received byte, another IEEE peculiarity.
EDB88320 constant crc-polynomial ( reversed IEEE )
hex
: CRC32_IEEE ( addr len -- crc ) \ input is address and length
FFFFFFFF -rot \ FFFFFFFF = start-value CRC
bounds do
i c@ xor
8 0 do
dup 1 and if \ if lsb = '1' do rshift and xor
1 rshift
crc-polynomial xor
else \ otherwise only a rshift
1 rshift
then
loop
loop
-1 xor \ invert output
;
===== Contributions =====