33 lines
1.1 KiB
Text
33 lines
1.1 KiB
Text
link hexcvt,printf
|
|
|
|
procedure main()
|
|
s := "The quick brown fox jumps over the lazy dog"
|
|
a := "414FA339"
|
|
printf("crc(%i)=%s - implementation is %s\n",
|
|
s,r := crc32(s),if r == a then "correct" else "in error")
|
|
end
|
|
|
|
procedure crc32(s) #: return crc-32 (ISO 3309, ITU-T V.42, Gzip, PNG) of s
|
|
static crcL,mask
|
|
initial {
|
|
crcL := list(256) # crc table
|
|
p := [0,1,2,4,5,7,8,10,11,12,16,22,23,26] # polynomial terms
|
|
mask := 2^32-1 # word size mask
|
|
every (poly := 0) := ior(poly,ishift(1,31-p[1 to *p]))
|
|
every c := n := 0 to *crcL-1 do { # table
|
|
every 1 to 8 do
|
|
c := iand(mask,
|
|
if iand(c,1) = 1 then
|
|
ixor(poly,ishift(c,-1))
|
|
else
|
|
ishift(c,-1)
|
|
)
|
|
crcL[n+1] := c
|
|
}
|
|
}
|
|
|
|
crc := ixor(0,mask) # invert bits
|
|
every crc := iand(mask,
|
|
ixor(crcL[iand(255,ixor(crc,ord(!s)))+1],ishift(crc,-8)))
|
|
return hexstring(ixor(crc,mask)) # return hexstring
|
|
end
|