CRC Prüfung
-
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 oderlg 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 nichtIch 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){
-
Ja das scheint jetzt zu funktionieren, aber jetzt geht die Eingabe wieder nicht mehr, also der erkennt richtig a = b99 und b = 13 aber als result gibt er mir dann b8a aus ...
char buffera[40], bufferb[40]; unsigned int a=0, b=0; unsigned int firstBit = 0x80000000; unsigned int c; int firstBitOfA = findFirstBitSet(a); int firstBitOfB = findFirstBitSet(b); int dataBits = firstBitOfA - firstBitOfB; int bShift = 31-firstBitOfB; printf ("\n\nBitte geben Sie das Sendepolynom ein: "); scanf("%32s", &buffera); getchar(); a=strtol (buffera, NULL, 2); printf ("a = %x", a); printf ("\nBitte geben Sie das Generatorpolynom ein: "); scanf("%32s", &bufferb); getchar(); b=strtol (bufferb, NULL, 2); printf ("b = %x", b);
-
versuch mal z.7 - z.10 inclusive unter z.22
-
Ja.. es funktioniert.. unglaublich..
Danke
-
@noobLolo
Hast du vielleicht ICQ?
Es wäre cool, wenn du mich mal adden würdest. Ich will dich nur noch bissi ausfragen und dann lass ich dich endlich in Ruhe
Meine ICQ-Nr.: xxxxxxxxxEdit:
Ah nee ich hab jetzt alles kapiertIch bin jetzt fertig..
Danke