CRC Prüfung



  • Ah ja genau.. das stimmt ...

    @noobLolo

    LoL ^^ ... klar wir machen das schon irgendwie.. Wie gesagt, mir sind die Ergebnisse eigentlich auch egal... Wenn 0 rauskommen soll, kommt sie auch raus und das ist das wichtigste für mich... Jetzt nur noch die Eingabe..

    Wie mach ich das mit dem strtol? Z.B. zahl = strtol("10011", NULL, 2);
    Wie mach ich das aber, dass der Wert in den Anführungsstrichen (10011) vom Benutzer eingegeben wird? Geht das ganz normal mit scanf? Z.B. scanf ("%d", &wert); ? Wie muss ich dann aber das strtol umändern?



  • kann mich leider erst wieder bischen später aktiv beteiligen

    unsigned int readBinaryNumber(){
    	char buffer[40];
    	scanf("%32s",buffer);//32 oder 31 bin mir da nicht so sicher
    	getchar();
    	return strtol(buffer, 0, 2);
    }
    


  • Ja ich muss jetzt langsam auch los 🙂 Bald ist Bescherung..

    noobLol hast mir wirklich geholfen! Nochmal fettes Dankeschön!!! Ohne Dich wär ich verloren... Ich poste hie rnochmal den Code, dass du das auch siehst, wie ich das benutze...

    #include <stdio.h>											 
    #include <conio.h>
    #include <stdlib.h>     
    
    int findFirstBitSet (int i)
    {
    	int x = 32;
    	while(x--)
    	{
    		if(i & 1<<x)
    			return x;
    	}
    	return -1;
    }
    
    int check (int) 
    {
        unsigned int a = 0xB99;                   //Sendepolynom
        unsigned int b = 0x13;                    //Generatorpolynom
        unsigned int firstBit = 0x80000000;
        int dataBits = findFirstBitSet(a);
    	unsigned int c = 0;
    
        a<<=31-findFirstBitSet(a);
        b<<=31-findFirstBitSet(b);
    
        c=a^b;
        while(dataBits--)
    	{
            if(c&firstBit)
    		{
                c^=b;
            }
    		else
                c<<=1;
        }
    	if (c==0)
    		return 1;
    	else
    	return 0;
    	getch ();
    }
    
    int main (void)
    {
    	int a, b;
    
    	printf ("Cyclic Redundancy Check");
    
    	do
    	{
    		printf ("\n\nWollen Sie Sendepolynom bestimmen oder \x81 \bberpr\x81 \bfen?");
    		printf ("\n1: Bestimmen\n2: \x9A \bberpr\x81 \bfen\n\n");
    		scanf ("%d", &a);
    
    		if (a==1 || a==2)
    		{
    			b=1;
    			printf ("\nGut\n");
    			if (a==1)
    				printf ("Die rechnerische Bestimmung des Sendepolynoms wird nun gestartet...");
    			else
    				printf ("Die rechnerische \x9A \bberpr\x81 \bfung des Sendepolynoms wird nun gestartet...");
    			if (check(1))
    				printf ("\n\nDie Information wurde RICHTIG \x81 \bbertragen!");
    			else
    				printf ("\n\nDie Information wurde FEHLERHAFT \x81 \bbertragen!");
    		}
    		else
    		{
    			printf ("\nKeine g\x81 \bltige Eingabe!\nBitte tippen Sie eine 1 oder 2 ein!");
    			b=0;
    		}
    	}
    	while (b==0);
    
    	getch();
    }
    

    Die Option 1 also die Bestimmung funzt natürlich nicht richtig, da kommt dann die Funktion von meinem Kollegen rein. Und dann muss ich nur noch in den nächsten Tagen das reinarbeiten, was du mir eben geschrieben hast, wie der Benutzer die Zahlen da eingeben kann und dann bin ich fertig...

    DANKE !!!



  • Ich hab's verstanden! Sagt mal: wenn man das mathematisch formuliert, kann man dann sagen, daß man bei solchen Polynom-Dingen ein Zahlensystem mit variabler, nichtnatürlicher Basis verwendet?



  • µngbd schrieb:

    ...kann man dann sagen, daß man bei solchen Polynom-Dingen ein Zahlensystem mit variabler, nichtnatürlicher Basis verwendet?

    polynome sind exemplare der mathematischen struktur der sogenannten 'ringe'. diese ringe (hat mit 'rund sein' übrigens nix zu tun, der name ist wohl rein willkürlich) haben gewisse eigenschaften und es sind bestimmte rechenoperationen damit möglich. die operationen gelten pro 'ring-klasse' und haben mit solchen anderer ringe nicht viel zu tun (z.b. + und * mit matrizen gehen auch anders, als + und * mit zahlen).
    btw, die ganzen zahlen z.b. sind auch ein 'ring' (aber ich glaub nicht nur, mathematische strukturen überlappen sich teilweise). just my 2 cents, aber frag mal besser im matheforum oder schau hier: http://www-groups.dcs.st-and.ac.uk/~history/HistTopics/Ring_theory.html
    🙂



  • Ja ich hab das jetzt so geamcht:

    char a[40];
    	char b[40];
    
    	scanf("%32s", &a);
        getchar();
        strtol(a, 0, 2);
    
    	scanf("%32s", &b);
        getchar();
        strtol(b, 0, 2);
    

    Aber der kann damit dann nicht rechnen, weil das vom Typ char [40] ist. Also das c=a^b und c^=b .



  • xX Dany Xx schrieb:

    Aber der kann damit dann nicht rechnen, weil das vom Typ char [40] ist. Also das c=a^b und c^=b .

    bau dir doch 'ne kleine library, die mit bit-strings umgehen kann bzw. such mal hier im C-forum, an ein oder zwei solcher codes kann ich mich dunkel erinnern.
    oder du macht das mit chars, ist zwar speicherverschwendung, aber nicht so schlimm, z.b.

    #define XOR(a,b) ((b)==(a) ? 0 : 1)
    

    🙂



  • Ja ich habs noch bissi geändert:

    char buffera[40], bufferb[40];
    	unsigned int a=0, b=0;
    
    printf ("\nsende: ");
    	scanf("%32s", &buffera);
        getchar();
    	a=strtol (buffera, NULL, 16);
    	printf ("\nsende ist: %x", a);
    
    	printf ("\ngen: ");
    	scanf("%32s", &bufferb);
        getchar();
    	b=strtol (bufferb, NULL, 16);
    	printf ("\gen ist: %x", b);
    

    Aber der spuckt mir da iwelche komische Werte aus... wenn ich 101110011001 eingebe, dann kommt 7fffffff raus und wenn ich 10011 eingebe kommt 10011 raus. Was ist falsch?



  • wenn du's als hex einliest strtol(...,...,16), ist 101110011001 zu gross für ein 'long' (max. 8 stellen bei 4-byte longs). mach hinten eine '2' in den strtol-aufruf, dann gehts.
    🙂



  • Geil.. es funzt.. fette Sache..

    Danke!



  • Hallo,

    ;fricky schrieb:

    [...] ringe ([...]der name ist wohl rein willkürlich).

    Nicht wirklich, es gibt ja z.B. auch Webringe 😉 , bei Interesse mal z.B. den Wikipedia-Artikel zu "Ringtheorie" lesen.

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    bei Interesse mal z.B. den Wikipedia-Artikel zu "Ringtheorie" lesen.

    merci. wikipedia hat ja wirklich alles. dort stehts ja schon im zweiten absatz. nur fehlt irgendwie 'ne erklärung, wie + und * in einem 'verbrecherring' definiert sind *fg*
    🙂



  • Hi ich bins mal wieder 😃

    Nun mein Part des Programms funktioniert jetzt und alles ist okay, aber ich bin jetzt schon seit ca. einer Woche am Nachgrübeln was da genau passiert... Könnte den Code für mich vielleicht jemand Zeile für Zeile durchgehen und mir erklären, was da jeweils genau abläuft? Ihr könnt den Code auch gerne kopieren, ihn kommentieren und hier wieder posten... oder einfach schreiben Zeile X: so und so ... das wäre wirklich sehr nett!

    Hier nochmal der Code:

    int findFirstBitSet (int i)
    {
    	int x = 32;
    	while(x--)
    	{
    		if(i & 1<<x)
    			return x;
    	}
    	return -1;
    }
    
    int check (int) 
    {
    	char buffera[40], bufferb[40];
    	unsigned int a=0, b=0;
        unsigned int firstBit = 0x80000000;
        int dataBits = findFirstBitSet(a);
    	unsigned int c = 0;
    
    	printf ("\n\nBitte geben Sie das Sendepolynom ein: ");
    	scanf("%32s", &buffera);
        getchar();
    	a=strtol (buffera, NULL, 2);
    
    	printf ("\nBitte geben Sie das Generatorpolynom ein: ");
    	scanf("%32s", &bufferb);
        getchar();
    	b=strtol (bufferb, NULL, 2);
    	printf ("\nDie rechnerische \x9A \bberpr\x81 \bfung des Sendepolynoms l\x84 \buft nun.\nBitte warten...");
    
        a<<=31-findFirstBitSet(a);
        b<<=31-findFirstBitSet(b);
    
        c=a^b;
        while(dataBits--)
    	{
            if(c&firstBit)
    		{
                c^=b;
            }
    		else
                c<<=1;
        }
    	if (c==0)
    		return 1;
    	else
    	return 0;
    	getch ();
    }
    


  • also nach dem ich das ja verbrochen hab bin ich dir auch eine erklärung schuldig 😞
    aber das kann so nicht laufen da dataBits immer mit -1 initialisiert wird und du dann in nen super endlos loop rein läufst...
    bin dir auch noch ne richtige version schuldig da ich ja schon immer sag das das ergebnis nicht stimmt auch wenn dataBits stimmen würde ist also alles so ne sache...
    wenn ich auf die schnelle was hin bekomm was stimmt bekommst auch deine erklärung ist ein deal oder 😃

    lg lolo



  • ja also die schleife läuft in der Tat sehr lange, das merkt man auch, wenn man das Programm startet, aber dennoch springt er iwann raus und gibt warum auch immer das vermutlich richtige Ergebnis aus. Zumindest kommt 0 raus, wenn sie rauskommen soll...



  • und ich hab mich schon über das

    \nBitte warten...");

    gewundert 😃



  • ja eben 🙂
    das dauert halt nur etwas länger, aber endlos ist sie offenbar nicht 👍

    Ich werds morgen wahrscheinlich eh hochladen müssen, aber eigetlich hast du Zeit bis Donnerstag... Deswegen brauch ich auch die Erklärung am besten zu jeder Zeile, weil ich nicht alles so ganz verstehe..



  • xX Dany Xx schrieb:

    aber eigetlich hast du Zeit bis Donnerstag

    also so war das eigentlich nicht gedacht...

    naja aber so sollts zumindest das machen was du willst...

    int findFirstBitSet(int i){
    	int x = 32;
    	while(x--){
    		if(i & 1<<x)
    			return x;
    	}
    	return -1;
    }
    int main(void) {
    	/*unsigned int a = 0x365;
    	unsigned int b = 0x35;*/
    
    	unsigned int b = 0x265;
    	unsigned int a = 0x35;
    
    	/*unsigned int a = 0xB99;
    	unsigned int b = 0x13;*/
    
    	unsigned int c;
    	unsigned int firstBit = 0x80000000;
    
    	int firstBitOfA = findFirstBitSet(a);
    	int firstBitOfB = findFirstBitSet(b);
    	int dataBits = firstBitOfA - firstBitOfB;
    	int bShift = 31-firstBitOfB;
    
    	if(dataBits<0){
    		printf("Error: Sendepolynom < Generatorpolynom;");
    		exit(1);
    	}
    
    	a<<=31-firstBitOfA;
    	b<<=bShift;
    
    	c=a^b;
    	while(dataBits--){
    	    if((c&firstBit) == 0)
    	    	c<<=1;
    	    if(c&firstBit)
    	        c^=b;
    	};
    
    	c>>=bShift;
    
    	printf("result: 0x%x",c);
    	return 0;
    }
    

    lg lolo



  • achso das ist natürlich bischen unglücklich

    while(dataBits--){
        if((c&firstBit) == 0)
            c<<=1;
        if(c&firstBit)
            c^=b;
    };
    

    besser wäre

    while(dataBits--){
        if((c&firstBit) == 0){
            c<<=1;
            if(c&firstBit)
                c^=b;
        }else
            c^=b;
    };
    

    glaub ich zumindest 🙄



  • ups 😕

    int findFirstBitSet(unsigned int i){ 
    statt 
    int findFirstBitSet(int i){
    

Anmelden zum Antworten