CRC Prüfung



  • Ne is beides falsch.. also weder -1 oder -2 weil... mit dem ursprünglichen beispiel funzt es dann nicht....

    Bei a = 0xB99; b = 0x13; int dataBits = findFirstBitSet(a)-1

    kommt dann raus 98000000 ... müsste ja aber 0 sein ..

    Edit 1
    Dass die Reste umgedreht waren war mir schon klar... aber wie gesagt, das ist eigentlich auch egal. WICHTIG ist nur, dass 0 rauskommt, wenn sie rauskommen soll...

    Edit 2
    Wieso eigentlich -1? Es muss einfach nur int dataBits = findFirstBitSet(a) heißen und dann kommt in beiden Fällen wieder richtigerweise 0 als Rest raus...
    Dann kommt sogar bei dem Beispiel a = 0xB90; b = 0x13 als Rest 48000000 das ist doch ne Hexzahl oder? Wenn man nun 48 (Hex) in binär umrechnet erhält man 1001000, richtig wäre aber 1001 also ohne die letzten bzw. ersten 3 Nullen. Ist das nur Zufall?



  • also bei mir stimmen die zwischen ergebnisse schon nur dass die schleife entweder zu früh oder zu spät abbricht und damit das end ergebnis verfälscht wird such da noch nach ner lösung wenn ich sie hab kommt sie natürlich wo sonst hier rein;)



  • Dann kommt sogar bei dem Beispiel a = 0xB90; b = 0x13 als Rest 48000000 das ist doch ne Hexzahl oder? Wenn man nun 48 (Hex) in binär umrechnet erhält man 1001000, richtig wäre aber 1001 also ohne die letzten bzw. ersten 3 Nullen. Ist das nur Zufall?

    naja das hab ich im vorletzten post beschrieben und sollte normal sein allerdings steht da nicht umsonst ein noop bzw noob vor dem lolo 😃



  • xX Dany Xx schrieb:

    Ja offenbar nicht..

    101110011001 : 10011 = irgendwas (unwichtig)
    10011
    -----
    0010000
      10011
      -----
      00011110
         10011
         -----
         011010
          10011
          -----
          010011
           10011
           -----
           00000 <- Rest = 0
    

    Aber 2969 : 19 = 156 Rest 5 bzw. 2969 modulo 19 = 5
    Und jetzt?

    die rechnung da oben^^ sieht richtig aus. CRC basiert ja auf polynomdivision, die bitmuster sind keine zahlen, bilder oder mp3s, sondern polynome. mit polynomen kann man auch ein bisschen rechnen, z.b. multiplizieren und teilen mit rest. z.b. dieses '10011' da ist nicht 0x13, sondern ein polynom 1*x^4 + 0*x^3 + 0*x^2 + 1*x^1 + 1x^0*. polynomdivision auf dem papier geht ähnlich wie wie schriftliche division mit zahlen, aber nur so ähnlich und das ergebnis ist eben ein rest-polynom und keine zahl.
    🙂



  • 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 😃


Anmelden zum Antworten