Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Crc

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
07.01.2004, 01:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu schreiben ist folgende einfache Funktion...

C++:
int* crc_check(int* b,int n,int* crc,int g);



b ist der zu checkende "text"
n ist die länge des "text" bzw intarrays,
crc ist das generatorpolynom (höchster koeffizient steht bei crc[0],
g ist der grad des polynoms das array crc hat also g+1 felder

wenn der algo drübergejagt ist steht das ergebnis in b... da das jedoch von Nullen angeführt wird (ist halt bei der polynomdivision so) soll nicht b zurückgegeben werden sondern der zeiger auf den rest, als der auf die letzten #g elemente....

genaueres zum verständnis siehe weiter unten...

ich habe das der einfachheit hablber mal mit integers gemacht... eigentlich müsste man einen text übergeben und am ende noch was dranhängen....


also die Idee ist folgende... Wir haben einen Sender und einen Empfänger. Der Empfänger weiss nicht ob das was er von Sender erhält korrekt ist... Um die daten zu verifizieren wird eine art checksumme ermittelt mittels derer der empfänger checken kann ob seine daten valide sind....
das ganze ist nichts anderes als eine binäre polynomdivision, deshalb besonders einfach weil man nur mit xors rechenen muss...

als beispiel nehmen wir mal folgendes:
zu übertragen: 1101011101
crc-polynom: 1011 das steht für x^3+x+1
in der praxis werden 16er und grössere polynome verwendet und man kann wohl auch mathematisch zeigen das das zu 99,999 weiss ich wieviel prozent funktioniert, das heisst der empfänger kann zu 99,999 prozent sicher sein das die daten die er erhalten hat korrekt sind (oder auch nicht dann lässt er sich die nochmal schicken)

aber zurück zur aufgabe....
das ganze läuft wie folgt ab
man schnappt sich den "text" und hängt grad des polynoms nullen ran...
in inserem beispiel wären das dann 1101011101 mit drei Nullen am ende als
1101011101000
mit dem machen wir jetzt eine polynomdivision mit dem polynom 1011
ist genauso wie in der schule gelernt nur das man das halt binär macht was halt besonders einfach ist weil man nur ein xor braucht...

schirttweise sieht das dann so aus...

C++:
1101011101000
1011
0110011101000
_1011
0011111101000
__1011
0001001101000
___1011
0000010101000
____0000            //hier wird nicht geteilt weil eine 0 vorne also zu nächsten stelle
0000010101000
_____1011
0000000011000
______0000
0000000011000
_______0000
0000000011000
________1011
0000000001110
_________1011
0000000000101  //rest ist also 101;



dem empfänger wird dann einfach der text plus dem rest geschickt...
er erhält dann 1101011101 + 101....
also 1101011101101

das das wiederum jagt der empänger wieder durch das polynom, ist der rest nicht 000 weiss er das ein fehler bei der übertragung passiert ist und muss sich den scheiss nochmal schicken lassen. Ist der Rest 000 weiss er das er mit einer hohen wahrscheinlichkeit davon ausgehen kann das alles in ordnung ist... Die Warhscheinlichkeit steigt tendenziell mit dem grad des polynomes


C++:
//dieser funktion übergibt man den zu senden text "hier der einfachheit halber als ints dargestellt und den rest den der anhängen soll, damit daraus das gesamt array gebastelt wird, das der crc_check funktion übergeben wird...
int* create_check(int*b,int n,int* r,int g){
    int *rv=new int[n+g];
    memcpy(rv,b,n*sizeof(int));
    memcpy(rv+n,r,g*sizeof(int));
    return rv;
}


int* crc_check(int* b,int n,int* crc,int g){
....
}



int main(){
int i,n=10,g=3;
int bits[]={1,1,0,1,0,1,1,1,0,1};
int crc[]={1,0,1,1};
int rest[]={0,0,0};
int *temp,*erg;

temp=create_check(bits,n,rest,g);
for(i=0;i<n+g;++i) printf("%d",temp[i]);
printf("\n\n\n");

erg=crc_check(temp,n+g,crc,g);

printf("Der Rest sieht also wie folgt aus: ");
for(i=0;i<g;++i) printf("%d",erg[i]);
printf("\n");

printf("Wir schicken dem Empfaenger also folgendes: ");
for(i=0;i<n;++i) printf("%d",bits[i]);
for(i=0;i<g;++i) printf("%d",erg[i]);
printf("\n");

memcpy(rest,erg,g*sizeof(int));
delete [] temp;

temp=create_check(bits,n,rest,g); //das hier bekommt der empfänger
printf("Der Empfaenger checkt das gleich mal ab....\n");
erg=crc_check(temp,n+g,crc,g);

printf("Der Rest sieht also wie folgt aus: ");
for(i=0;i<g;++i) printf("%d",erg[i]);
printf("\n");
printf("Wenn der Rest nur Nullen enthaelt ist ein Fehler unwahrscheinlich, sonst ist ein Fehler aufgetreten");

}


so ich hoffe es sind keine Fragen offen geblieben

eigentlich wollte ich das als golfrätsel spielen weil das wirklich nur ein zweizeiler ist... ich nehme aber auch andere Lösungen

so für die golfer ist par 140 und für beefy sind es diesmal 2 weniger als ich

@beefy
und nicht wieder bescheissen
so hat das auszusehen rumgefummelt wird nur an dem text zwischen den geschweiften klammern

C++:
int* crc_check(int* b,int n,int* crc,int g){....}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.01.2004, 01:56 Uhr
0xdeadbeef
Gott
(Operator)


So ein Blödsinn. Darf ich jetzt C ausschöpfen oder nicht? Meine Signatur sieht, wenn, dann so aus:

C++:
int*crc_check(b,n,c,g)int*b,*c;{...}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.01.2004, 01:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ja gut poste wie du willst die fehlenden zeichen schlag ich dir wieder drauf..

sag mal beefy hast du es in letzter zeit nötig weil du angst hast gegen mich deine zweite niederlage einzustecken?...
Ich riche schon deinen Angstschweiss...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.01.2004, 02:05 Uhr
0xdeadbeef
Gott
(Operator)


Ich denke, da ist mein Vorsprung noch groß genug. Ich lass mich nur nicht gerne in meinen Möglichkeiten einschränken.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.01.2004, 02:09 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ich denke, da ist mein Vorsprung noch groß genug...


wiso hast du schon wieder auf anhieb ne Lösung unter 100
Ich habs noch gar nicht golfmässig geproggt... werd mich aber gleich mal dran machen...

Bevor du was auflöst gib den anderen mal auch ne chance... können nicht alle so schnell proggen wie du...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.01.2004, 02:21 Uhr
0xdeadbeef
Gott
(Operator)


Ich meinte eigentlich meinen Vorsprung an Siegen. An dieses Problem werde ich mich wohl morgen mal setzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.01.2004, 10:35 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

An dieses Problem werde ich mich wohl morgen mal setzen


so man es denn problem nenn kann... ist ja vom schwierigkeitsgrad her so wie das mit der ableitung wo mir schon nach ein paar minuten die lösungen um den kopf flogen....
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 07.01.2004 um 10:35 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.01.2004, 10:43 Uhr
(un)wissender
Niveauwart


@windalf
Wenn es mich jetzt nicht komplett täuscht, hast du wiedermal ein Memoryleak produziert!
Wann löscht du eigentlich erg?
(Das wird da wohl in der Funktion dynamisch allokiert werden müssen.)
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.01.2004, 11:53 Uhr
(un)wissender
Niveauwart


Das sollte es tun.
Allerdings bin ich mir mit if(j == 0 && temp[i + j] == 0)
nicht sicher, da ich ja eingentlich abfragen müsste, ob der Abschnitt der Daten kleiner ist als der CRC-Code.
Bei diesem Beispiel funzt es, aber generell bin ich mir da nicht sicher.


C++:
int* crc_check(int* b,int n,int* crc,int g) {
    int *result = new int[g]; //Das Ergebnis
    int *temp = new int[n];
    memcpy(temp, b, n * sizeof(int)); //Kopie anlegen der Daten  
      
    for(int i = 0; i < n - g; ++i) { //Die Schleife :)
        for(int j = 0; j < g + 1; ++j) {//Nochne Schleife                              
            if(j == 0 && temp[i + j] == 0)
                break;
            temp[i + j] ^= crc[j];            
        }          
    }
      
    memcpy(result, temp + n - g, g * sizeof(int));
    delete [] temp;
    return result;
}



[Edit]
Codecorrektur
[/Edit]
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 07.01.2004 um 12:36 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.01.2004, 12:16 Uhr
(un)wissender
Niveauwart


Irrtum meinerseits, passt schon so, da ja immer nur um eine Stelle verschoben wird.


Bearbeitung:

Vernünftig wäre es die Signatur:

C++:
int* crc_check(int* b,int n,int* crc,int g);



in

C++:
int* crc_check(const int* b,int n,const int* crc,int g);



zu ändern.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 07.01.2004 um 12:57 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: