// CRC.cpp : Example program for computing slide label CRC.
// Copyright 2003 Cytyc Corp. All rights reserved.
#include <stdio.h>
#define SLIDE_ID_LEN 11 // Length of slide ID
// This function computes and returns the CRC associated with the slideIDString input
// argument.
//
unsigned char computeCrc(char *slideIdString)
{
unsigned char Local8BitPoly = 0x025;
unsigned char crcTable[256];
int i,j;
unsigned char crc = 0;
// Generate CRC table
unsigned char crc_accum;
for(i=0; i<256; i++)
{
crc_accum = (unsigned char) i;
for(j=0; j<8; j++)
{ // If lead 1 then XOR to divide else move on.
if(crc_accum & 0x80)
crc_accum = (crc_accum << 1) ^ Local8BitPoly;
else
crc_accum = (crc_accum << 1);
}
crcTable[i] = crc_accum; // Update next item in table
}
// calculate the CRC
for(j=0; j < SLIDE_ID_LEN; j++)
{
i = ((crc) ^ slideIdString[j]) & 0xff;
crc = (crc << 8) ^ crcTable[i];
}
return crc;
}
// This main program provides an example of how to use the computeCrc function.
// In this example, the CRC's are computed and displayed for a range of 25 ID's starting
// with the ID value of "140180001".
//
int main(int argc, char* argv[])
{
long id = 14222300;
long y_id = 11;
char idstring[SLIDE_ID_LEN+1];
int i;
// Generate CRC for 25 values
for (i=0; i < 11; i++, id++)
{
sprintf(idstring, "%02ld%09ld", y_id, id);
printf("%s %03d\n", idstring, computeCrc(idstring));
}
return 0;
}
Ly8gQ1JDLmNwcCA6IEV4YW1wbGUgcHJvZ3JhbSBmb3IgY29tcHV0aW5nIHNsaWRlIGxhYmVsIENSQy4KLy8gQ29weXJpZ2h0IDIwMDMgQ3l0eWMgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCgojaW5jbHVkZSA8c3RkaW8uaD4KCiNkZWZpbmUgU0xJREVfSURfTEVOIDExCQkvLyBMZW5ndGggb2Ygc2xpZGUgSUQKCi8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIENSQyBhc3NvY2lhdGVkIHdpdGggdGhlIHNsaWRlSURTdHJpbmcgaW5wdXQgCi8vIGFyZ3VtZW50LgovLyAgCnVuc2lnbmVkIGNoYXIgY29tcHV0ZUNyYyhjaGFyICpzbGlkZUlkU3RyaW5nKQp7Cgl1bnNpZ25lZCBjaGFyIExvY2FsOEJpdFBvbHkgPSAweDAyNTsKCXVuc2lnbmVkIGNoYXIgY3JjVGFibGVbMjU2XTsKCWludCBpLGo7Cgl1bnNpZ25lZCBjaGFyIGNyYyA9IDA7CgkKCS8vIEdlbmVyYXRlIENSQyB0YWJsZQoJdW5zaWduZWQgY2hhciBjcmNfYWNjdW07Cglmb3IoaT0wOyBpPDI1NjsgaSsrKQoJewoJCWNyY19hY2N1bSA9ICh1bnNpZ25lZCBjaGFyKSBpOwoJCQoJCWZvcihqPTA7IGo8ODsgaisrKQoJCXsgLy8gSWYgbGVhZCAxIHRoZW4gWE9SIHRvIGRpdmlkZSBlbHNlIG1vdmUgb24uCgkJCWlmKGNyY19hY2N1bSAmIDB4ODApCgkJCQljcmNfYWNjdW0gPSAoY3JjX2FjY3VtIDw8IDEpIF4gTG9jYWw4Qml0UG9seTsKCQkJZWxzZQoJCQkJY3JjX2FjY3VtID0gKGNyY19hY2N1bSA8PCAxKTsKCQl9CgkJY3JjVGFibGVbaV0gPSBjcmNfYWNjdW07ICAvLyBVcGRhdGUgbmV4dCBpdGVtIGluIHRhYmxlCgl9CQoKCgkvLyBjYWxjdWxhdGUgdGhlIENSQwoJZm9yKGo9MDsgaiA8IFNMSURFX0lEX0xFTjsgaisrKQoJewoJICBpID0gKChjcmMpIF4gc2xpZGVJZFN0cmluZ1tqXSkgJiAweGZmOwoJICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjVGFibGVbaV07Cgl9CgoJcmV0dXJuIGNyYzsKfQoKCi8vIFRoaXMgbWFpbiBwcm9ncmFtIHByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgY29tcHV0ZUNyYyBmdW5jdGlvbi4KLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgQ1JDJ3MgYXJlIGNvbXB1dGVkIGFuZCBkaXNwbGF5ZWQgZm9yIGEgcmFuZ2Ugb2YgMjUgSUQncyBzdGFydGluZyAKLy8gd2l0aCB0aGUgSUQgdmFsdWUgb2YgIjE0MDE4MDAwMSIuCi8vCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKCWxvbmcgaWQgPSAxNDIyMjMwMDsKCWxvbmcgeV9pZCA9IDExOwoJY2hhciBpZHN0cmluZ1tTTElERV9JRF9MRU4rMV07CglpbnQgaTsKCgkvLyBHZW5lcmF0ZSBDUkMgZm9yIDI1IHZhbHVlcwoJZm9yIChpPTA7IGkgPCAxMTsgaSsrLCBpZCsrKQoJewoJCXNwcmludGYoaWRzdHJpbmcsICIlMDJsZCUwOWxkIiwgeV9pZCwgaWQpOwoJCXByaW50ZigiJXMgICAlMDNkXG4iLCBpZHN0cmluZywgY29tcHV0ZUNyYyhpZHN0cmluZykpOwoJfQoKCXJldHVybiAwOwp9Cgo=