اطلاعیه

Collapse
No announcement yet.

CRC-16-CCITT

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    CRC-16-CCITT

    با سلام .
    محاسبه CRC روش های مختلفی داره . مثل CRC-16 و CRC-16-CCITT و CRC-16-IBM و ....

    من دارم روی CRC-16-CCITT کار میکنم . ولی اصلا جواب درست به دست نمیارم .
    مثالهای مختلفی روی اینترنت هست . ولی از هیچ کدومش جواب نگرفتم .
    کسی روی این موضوع کار کرده ؟

    #2
    پاسخ : CRC-16-CCITT

    تا حالا این چیزا رو فهمیدم که پارامترهای محاسبه باید برابر مقادیر زیر باشه
    check=0x906E
    poly=0x1021
    init=0xFFFF
    refin=true
    refout=true

    دیدگاه


      #3
      پاسخ : CRC-16-CCITT

      مشکل حل شد .
      فایل زیر ، یک کتابخانه است که در آن تابع مورد نیاز قرار داده شده .
      روش کار این تابع بر اساس الگوریتم CRC-16/X-25 است .
      کد:
      
      
      
      const int order = 16;
      const unsigned long polynom = 0x1021;
      const int direct = 1;
      const unsigned long crcinit = 0xFFFF;
      const unsigned long crcxor = 0xFFFF;
      const int refin = 1;
      const int refout = 1;
      
      
      unsigned long crcmask;
      unsigned long crchighbit;
      unsigned long crcinit_direct;
      unsigned long crcinit_nondirect;
      
      
      unsigned long reflect (unsigned long crc, int bitnum)
      {
      
      
      	// reflects the lower 'bitnum' bits of 'crc'
      
      
      	unsigned long i, j=1, crcout=0;
      
      
      	for (i=(unsigned long)1<<(bitnum-1); i; i>>=1) {
      		if (crc & i) crcout|=j;
      		j<<= 1;
      	}
      	return (crcout);
      }
      
      
      unsigned long crcbitbybitfast(unsigned char p[], unsigned long len)
      {
      
      
      	// fast bit by bit algorithm without augmented zero bytes.
      	// does not use lookup table, suited for polynom orders between 1...32.
      
      
      	unsigned long i, j, c, bit;
      	unsigned long crc = crcinit_direct;
      
      
      	for (i=0; i<len; i++) {
      
      
      		c = (unsigned long)*p++;
      		if (refin) c = reflect(c, 8);
      
      
      		for (j=0x80; j; j>>=1) {
      
      
      			bit = crc & crchighbit;
      			crc<<= 1;
      			if (c & j) bit^= crchighbit;
      			if (bit) crc^= polynom;
      		}
      	}	
      
      
      	if (refout) crc=reflect(crc, order);
      	crc^= crcxor;
      	crc&= crcmask;
      
      
      	return(crc);
      }
      
      
      void init_crc(void)
      {
      	crcmask = ((((unsigned long)1<<(order-1))-1)<<1)|1;
      	crchighbit = (unsigned long)1<<(order-1);
      }
      
      
      unsigned long cal_crc(unsigned char p[], unsigned long len)
      {
      	int i;
      	unsigned long bit, crc;
      	if (!direct) {
      
      
      		crcinit_nondirect = crcinit;
      		crc = crcinit;
      		for (i=0; i<order; i++) {
      
      
      			bit = crc & crchighbit;
      			crc<<= 1;
      			if (bit) crc^= polynom;
      		}
      		crc&= crcmask;
      		crcinit_direct = crc;
      	}
      
      
      	else {
      
      
      		crcinit_direct = crcinit;
      		crc = crcinit;
      		for (i=0; i<order; i++) {
      
      
      			bit = crc & 1;
      			if (bit) crc^= polynom;
      			crc >>= 1;
      			if (bit) crc|= crchighbit;
      		}	
      		crcinit_nondirect = crc;
      	}
      	return crcbitbybitfast( p,  len);
      }
      
      
      
      
      [LEFT][/LEFT]


      دلیل: ادغام دو پست برای جلوگیری از اسپم

      روش استفاده از این کتابخانه هم بصورت زیر است

      کد:
      [FONT=Yekan]init_crc();[/FONT]
      [FONT=Yekan]   crc_=cal_crc(p,l);[/FONT]

      دیدگاه

      لطفا صبر کنید...
      X