[linux-programlama] Re: CRC Check

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Tue 13 Jul 2004 - 12:40:24 EEST


Selamlar..

BU CRC ne ile alinmis o onemli. CRC32, CRC16 ?

CRC32 ve CRC32B ikiside mhash ile yapilabilir.

http://mhash.sourceforge.net/

Alttaki sonuclar 16 Bit, demekki size 16 Bit CRC uretici lazim:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define M16 0xA001 /* crc-16 mask */
#define MTT 0x1021 /* crc-ccitt mask */
 
unsigned int updcrc(unsigned int,int,unsigned int);
unsigned int updcrcr(unsigned int,int,unsigned int);
void perr(char *msg);
 

char filename[100];
unsigned int crc16,crctt;
int ch;
unsigned long num;
FILE *fp;
 
main(argc,argv)
int argc; char **argv;
{
        if(argc>2) perr("Usage: crc2 [filename]");
        if(argc==2) strcpy(filename,argv[1]);

        /* Yukaridaki buffer overflow exploit vakasina dikkat */

        else
        {
                printf("\nEnter filename: "); gets(filename);
        }
        if((fp=fopen(filename,"rb"))==NULL) perr("File cannot be
opened\n");
        num=0L; crc16=crctt=0;
        while((ch=fgetc(fp))!=EOF)
        {
                num++;
                crc16=updcrcr(crc16,ch,M16);
                crctt=updcrc(crctt,ch,MTT);
        }
        fclose(fp);
        printf("\n%d Bytes CRC hesaplandi.\nCRC16 = %04X\nCRCTT = %04X",
                num,crc16,crctt);
}

unsigned int updcrc(crc,c,mask)
unsigned int crc,mask; int c;
{
        int i;
        c<<=8;
        for(i=0;i<8;i++)
        {
                if((crc ^ c) & 0x8000) crc=(crc<<1)^mask;
                else crc<<=1;
                c<<=1;
        }
        return crc;
}
 
unsigned int updcrcr(crc,c,mask)
unsigned int crc,mask; int c;
{
        int i;
        for(i=0;i<8;i++)
        {
                if((crc ^ c) & 1) crc=(crc>>1)^mask;
                else crc>>=1;
                c>>=1;
        }
        return crc;
}
 
void perr(s)
char *s;
{
        printf("\n%s",s); exit(1);
}

Sanirim bu kod isinizi gorebilir, derlemek, denemek filan lazim,
ayakustu yazinca biraz guvenilmez olabiliyor.. Bu file uzerinden aliyor
datayi, defalarca binary stringi komut satirina koymak zor olabilir..

Saygi ve sevgiler..

> merhabalar,
> yazdigim bir programda tasidigim verilerin guvenligini saglamak amaci ile
> "CRC (Cyclic Redundancy Code) Check" metodu kullanmak istemekteyim. Bunun icin
> elimde asagidakine benzer bir kac tane ornek var:
>
> Related Command | CRC Code
> ------------------+---------
> 01 05 00 00 FF FF | CC 7A
> 01 04 00 00 00 03 | B0 0B
> 01 02 00 00 00 08 | 79 CC
>
> internette yaklasik 1 haftadir CRC'nin nasil hesaplandigi uzerine arastirmalar
> yapiyorum ve sorun su ki buldugum metodlar ile elde ettigim CRC Check
> sonuclarinin hicbiri yukaridaki gibi olmuyor (yani ornegin: CC 7A'yi hic elde
> edemedim :) belirtmem gerekirse kalan metodundan teker teker bulma ya da
> "High Order Byte" ve "Low Order Byte" tablolarindan yaralanarak sonuc elde etme
> (hos ikisinin de ayni kapiya cikmasi lazim teorikte ama...) gibi yontemler de
> denedim.
>
> bu konuda deneyimli arkadaslar varsa, yardimlari gercekten cok makbule gececek.
> ilgili fonksiyonun hangi programlama dilinde oldugunun da onemi yok,
> anlasilabilir olsun yeter. ne de olsa algoritma, algritmadir.
>
> iyi calismalar
>
>
> -- Attached file included as plaintext by Ecartis --
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.4 (GNU/Linux)
>
> iD8DBQFA86dhGcWq5WdHoacRAnQKAJ9KOu32STbsfazQ/Edd7WmcgDSjmACgiGUJ
> b+lWLX+vJMJxqkV/WAFtpxc=
> =pFT0
> -----END PGP SIGNATURE-----
>
>
>
>


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.