TIP: Click on subject to list as thread! ANSI
echo: os2prog
to: Gary Chambers
from: David Muir
date: 1996-03-23 15:49:32
subject: Re: 32-bit CRC

-=> Quoting Gary Chambers to David Muir <=-

 GC> Unfortunately, I don't have your original message handy.  I noticed
 GC> that you were able to calculate 2 different CRCs, though.  Would you
 GC> mind sharing your code with me?  I used the one in Bob Stout's SNIPPETS

    Actually the code is in Turbo Pascal (and/or Virtual Pascal). I checked 
the CRC with THDPRO.EXE (my upload tester) and double checked the values by 
creating files with an editor containing only those three bytes and
"zip"ing 
them. Ran "PKUNZIP -v" to compare values (to ensure I had the
correct values).
    CRC routines are available in RZSZ (the UNIX Zmodem routines) which 
produce the same results (remembering of course to start with the correct seed 
and to "not" the CRC after calculation).

 GC> file, and I think there may have been some problems caused by compiler
 GC> differences (i.e. data type size differences in 16-bit and 32-bit
 GC> compilers) -- I HAVEN'T CHECKED, it's just a hunch...  Thanks for the
 GC> reply!! 

    I've found the compiler/platform to make no difference in
"my" experience 
with CRC's since you're essentially dealing with only long integers and bytes 
(Long and char). However if you still need me to post "C" code, I
can do so in 
from the RZSZ CRC routines.

    As a rule,, the easiest way to "test" your crc routines is have them 
calculate the CRC of a file (rather than an array of any kind) since these 
values can be checked by archiving them and then using the "view"
option of 
the (un)archiver.

    In Turbo/Virtual Pascal the following is the method I use... (it converts 
to "C" easily enough although I wouldn't count on "my"
conversions if I were 
you, since I couldn't write a working "C" program if my life
depended on it)

    {typedef unsigned long int UNS_32_BITS;}
  Const
    CRCSeed = $ffffffff; {0xffffffff}

    {static UNS_32_BITS crc_32_tab[] =}
    { sorry you'lle have to convert the table yourself simply replace the
      "$" with "0x" in all instances in the table}
    CRC32tab : Array[0..255] of LongInt = (
      $00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
      $e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
      $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
      $f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
      $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
      $fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
      $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
      $dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
      $26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
      $cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
      $2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
      $98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
      $7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
      $91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
      $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
      $8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
      $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
      $a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
      $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
      $be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
      $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
      $b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
      $ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
      $0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
      $f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
      $196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
      $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
      $38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
      $d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
      $316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
      $cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
      $2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
      $9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
      $72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
      $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
      $68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
      $88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
      $616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
      $a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
      $40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
      $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
      $54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
      $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d  );

Var
tocalc:string; {char tocalc[3]}
i,crc:longint; {static unsigned long i}
               {static unsigned long crc}

{#define UPDC32(octet, crc) (crc_32_tab[((crc)^(octet))&0xff]^((crc)
>> 8))}

Function  CRC32(value: Byte; crc: LongInt) : LongInt;
begin
CRC32 := CRC32tab[Byte(crc xor LongInt(value))] xor
           ((crc shr 8) and $00ffffff);
end;

Function CRCend( crc : LongInt ): LongInt;
begin
CRCend := (crc xor CRCSeed);
end;

{    Remember to seed the CRC first with "crcseed" before
processing the first 
byte and to use CRCend upon completion of the calculation. Also, "this" 
routine does not return the "hex" value of the crc}

{I assume you can convert this easily enough}
begin
tocalc:='AAL';
{tocalc="AAL";}
crc:=crcseed;
{crc=crcseed;}
for i:=1 to length(tocalc) do crc:=crc32(ord(tocalc[i]),crc);
{for (i=0; i<=3; ++i) crc = crcend(crc);}
crc:=crcend(crc);
{crc = ~crc;}
writeln(crc);
{printf("CRC = %ld\n", crc);}
tocalc:='UAL';
{tocalc="UAL";}
crc:=crcseed;
{crc=crcseed;}
for i:=1 to length(tocalc) do crc:=crc32(ord(tocalc[i]),crc);
{for (i=0; i<=3; ++i) crc = crcend(crc);}
crc:=crcend(crc);
{crc = ~crc;}
writeln(crc);
{printf("CRC = %ld\n", crc);}
end.

And "PLEASE" don't correct my "C". Like I said above..
"C" is NOT my forte. 
And my attempted conversion could be so far off as to cause world piece upon 
execution .

Dave...

... THD ProScan support on the web, http://www.naples.net/~nfn03274
~~~ TGWave v1.12+
--- GEcho 1.11+
* Origin: fks Online! * Ontario, Canada * (905)820-7273 * (1:259/423)
SEEN-BY: 50/99 78/0 270/101 620/243 711/401 409 410 413 430 808 809 934 955
SEEN-BY: 712/407 515 517 628 713/888 800/1 7877/2809
@PATH: 259/423 400 99 250/99 3615/50 396/1 270/101 712/515 711/808 809 934

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.