HIGHSCORE, BITTE JEDER DER AHNUNG HAT KURZ MAL REIN SCHAUEN, BRAUCHE DAS MEGA SCHNELL
-
@Konfusius
Ich glaube es gibt eine günstiger Lösung. Mach eine union mit 2 elementen, das eine ist die Struct das andere eine array of byte mit der gleichen Länge wie die struct.
Die Daten in die Struct kopieren und als Array of Byte abholen. ich spreche hier von einem Array of Byte und nicht von einem String alle alle Zeichen auch die \0 an jeder Stelle möglich sind. Die Länge ist fest und bekannt.
Auf dies Array of Byte kann ich jedes beliebige schleierverfahren (siehe oben) anwenden und es dann anschließend mit write binaer in eine File schreiben.Lesen geht dann genau andersrum.
read aus dem file
entschleiern
in union kopieren
als struct abholenDas array of byte wird genauso angelegt wie ein string am besten mit
unsigned char Testarry[24];
Alles weiter kann man hier erfragen oder in jedem C-Buch nachlesen. :p
-
PAD schrieb:
Ich glaube es gibt eine günstiger Lösung.
ich finde deinen ansatz auch gut. er ließe sich aber noch weiter vereinfachen. anstatt eine union zu verwenden kann man den zeiger auf die struktur einfach auf (char*) casten.
bliebe nur noch, eine funktion *verschluesseln(char daten, int anz) zu schreiben. dabei muß aber unbedingt darauf geachtet werden, daß keine bytes !=0 auf 0 abgebildet werden und umgekehrt. sonst würde die ende-markierung der strings in der struktur zertört werden und sie könnte nicht mehr mit fprintf() gespeichert werden. das ließe sich beim xor-algorithmus erreichen, indem man nur bytes xor't die sowohl !=0 als auch !=schlüssel sind.
ich kanns nicht lassen und muß jetzt doch wieder mal code posten
const int schluessel=0xAA; void verschluesseln (char *daten, int anz) { while(anz--) if(daten[anz]!=0 and daten[anz]!=schluessel) daten[anz]=daten[anz]^schlüssel; }
der algorithmus ist selbstinvers, dh das entschlüsseln erfolgt durch einen weiteren aufruf von verschluesseln().
Master-of-Scare schrieb:
mir ist auch klar das er es besser kann
eigentlich war mein post auch ein bißchen selbstkritisch gemeint. ich wollte damit sagen, daß ich mich nicht für einen besseren programmierer halte, nur weil ich mehr code poste als andere. mir macht das coden einfach nur spaß. und wenn andere weniger code posten, dann deshalb, weil sie wollen, daß die anfänger hier im forum was lernen. ich denke aber auch, daß ein stück code einem anfänger häufig mehr sagt als seitenlanges fachchinesisch
-
@Konfusius
Das ist der Grund warum ich hier nicht mit einem null Terminierten C-String
sondern mit einem Array of Byte wie in Pascal da gehört nämlich noch die Länge dazu.verschluesseln (char *daten, int anz)
{
for (i=0;i<anz;i++)
daten[i]=daten[i]^schlüssel;
}MfG
PAD
-
@PAD
hmmm... das haut aber nicht hin. denn mit der ganzen struktur verschlüsselst du ja auch die längenangabe!
-
ok, das:
const int schluessel=0xAA; void verschluesseln (char *daten, int anz) { while(anz--) if(daten[anz]!=0 and daten[anz]!=schluessel) daten[anz]=daten[anz]^schlüssel; }
klingt echt super und ist unkompiziert, eine kurze frage dazu, was ist in dem fall wo du mir zb die eine highscore geschrieben hast daten und was anz?
-
also darauf könntest du auch von selber kommen
daten ist ein zeiger auf den zu verschlüsselnden speicherbereich. in deinem falle ist das logischerweise das, was du verschlüsseln willst, nämlich ein feld von highpl[].
anz ist die länge des speicherbereichs in bytes, auf den daten zeigt, also sizeof(struct highpl).
-
axo ^^
-
Missverständlich ausgedrückt von mir. Die Länge des array of bytes ist nicht bestandteil der Struktur und wir nicht mitverschlüsselt. In unserem Fall ist die Länge eines Records ja immer gleich lang.
Allerdings hast du mich damit auf einen guten Gedanken für andere Sachen gebracht.
Um aber array of char´s unterschiedlicher Länge verschlüsselt zu speichern ginge folgendes Konstrukt.WriteCoded(char *daten) { unsigned int len; len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen; verschluesseln (daten,len) ; // jetzt verschlüsselt write(fp,len,sizeof(unsigned int)); write(fp,daten,len*(sizeof(char))); } ReadCoded(char *daten) { read(fp,len,sizeof(unsigned int)); read(fp,daten,len*(sizeof(char))); verschluesseln (daten,len) ; // jetzt entschlßsselt }
-
@PAD
wie waers mit:WriteCoded(char *daten){ unsigned int len; len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen; verschluesseln (daten,len) ; // jetzt verschlüsselt write(fp,len,sizeof(unsigned int)); write(fp,daten,len*(sizeof(char))); }//end WriteCoded ReadCoded(char *daten){ read(fp,len,sizeof(unsigned int)); read(fp,daten,len*(sizeof(char))); verschluesseln (daten,len) ; // jetzt entschlßsselt }//end ReadCoded
jetzt den Stil betreffend
ach ja weil jemand auf der 1.Seite über goto geschimpft hat ich find goto schon genial da kann man so schön brutal sein findet ihr nicht
goto 4 ever
rülps--- tschuldigung
-
volkardus schrieb:
Master-of-Scare schrieb:
sollte jedoch dabei auch noch kurz sein...
keine bange, die wird sehr kurz. schau in dein c-buch unter dem stichwort arrays nach. das vereinfacht die lange variablenliste, und du kannst dich dann auf's wesentliche kondensieren.
LOL *scnr* *duckundweg*
-
Dann müsste das etwa doch so aussehen, oder? :
void WriteCoded(char *); void ReadCoded(char *); void verschluesseln(char *, int); const int schluessel=0xAA; void verschluesseln (char *daten, int anz) { while(anz--) if(daten[anz]!=0 and daten[anz]!=schluessel) daten[anz]=daten[anz]^schluessel; } void WriteCoded(char *highpl) { unsigned int len; len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen; verschluesseln (highpl,len) ; // jetzt verschlüsselt write(fp,len,sizeof(unsigned int)); write(fp,highpl,len*(sizeof(char))); } void ReadCoded(char *highpl) { read(fp,len,sizeof(unsigned int)); read(fp,highpl,len*(sizeof(char))); verschluesseln (highpl,len) ; // jetzt entschlßsselt } struct highpl { int punkt; char name[4]; /* der name soll nur 3 zeichen lang sein, */ }; void highscore_lesen (struct highpl *highpl) { FILE *pfile; int i; pfile=fopen("C:\\system.zrx","r"); for(i=0; i<8; i++) fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name); fclose(pfile); } void highscore_schreiben (struct highpl *highpl) { FILE *pfile; int i; pfile=fopen("C:\\system.zrx","w"); for(i=0; i<8; i++) fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name); fclose(pfile); } void highscore_einfuegen (struct highpl *highpl, int punkt, char *name) { int pos,i; /* bestimme position, an der der neue highscore eingefügt werden soll */ for(pos=0; pos<8; pos++) if(punkt>highpl[pos].punkt) break; if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ /* schiebe highscores nach unten */ for(i=7; i>pos; i--) { highpl[i].punkt=highpl[i-1].punkt; strcpy(highpl[i].name,highpl[i-1].name); } /* füge neuen highscore ein */ highpl[pos].punkt=punkt; strcpy(highpl[pos].name,name); } void highscore_eingeben (int punkte) { struct highpl highpl[8]; char name[256]; highscore_lesen(highpl); if(punkte>=highpl[7].punkt) { printf("NEUER HIGHSCORE!\n\n"); printf("Ihre Punktzahl ist: %i\n",punkte); printf("Ihr Name (max. 3 Zeichen): "); scanf("%s",name); name[3]='\0'; /* auf 3 zeichen kürzen */ printf("\n\n"); highscore_einfuegen(highpl,punkte,name); WriteCoded(highpl); highscore_schreiben(highpl); } } void highscore_ausgeben (void) { struct highpl highpl[8]; int i; highscore_lesen(highpl); ReadCoded(highpl); for(i=0; i<7; i++) printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); printf(" 7,5. %i Pkt\n",highpl[8].punkt); }
PS: Der Text ist bisher nur leicht verändert, gerade beim ausgeben, da ich bisher net groß zeit hatte.
-
brav hast du das gemacht
so waere das aber NOCH besser:
void WriteCoded(char *); void ReadCoded(char *); void verschluesseln(char *, int); const int schluessel=0xAA; void verschluesseln (char *daten, int anz) { while(anz--) if(daten[anz]!=0 and daten[anz]!=schluessel) daten[anz]=daten[anz]^schluessel; } void WriteCoded(char *highpl) { unsigned int len; len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen; verschluesseln (highpl,len) ; // jetzt verschlüsselt write(fp,len,sizeof(unsigned int)); write(fp,highpl,len*(sizeof(char))); } void ReadCoded(char *highpl) { read(fp,len,sizeof(unsigned int)); read(fp,highpl,len*(sizeof(char))); verschluesseln (highpl,len) ; // jetzt entschlßsselt } struct highpl { int punkt; char name[4]; /* der name soll nur 3 zeichen lang sein, */ }; void highscore_lesen (struct highpl *highpl) { FILE *pfile; int i; pfile=fopen("C:\\system.zrx","r"); for(i=0; i<8; i++) fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name); fclose(pfile); } void highscore_schreiben (struct highpl *highpl) { FILE *pfile; int i; pfile=fopen("C:\\system.zrx","w"); for(i=0; i<8; i++) fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name); fclose(pfile); } void highscore_einfuegen (struct highpl *highpl, int punkt, char *name) { int pos,i; /* bestimme position, an der der neue highscore eingefügt werden soll */ for(pos=0; pos<8; pos++) if(punkt>highpl[pos].punkt) break; if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ /* schiebe highscores nach unten */ for(i=7; i>pos; i--) { highpl[i].punkt=highpl[i-1].punkt; strcpy(highpl[i].name,highpl[i-1].name); } /* füge neuen highscore ein */ highpl[pos].punkt=punkt; strcpy(highpl[pos].name,name); } void highscore_eingeben (int punkte) { struct highpl highpl[8]; char name[256]; highscore_lesen(highpl); if(punkte>=highpl[7].punkt) { printf("NEUER HIGHSCORE!\n\n"); printf("Ihre Punktzahl ist: %i\n",punkte); printf("Ihr Name (max. 3 Zeichen): "); scanf("%s",name); name[3]='\0'; /* auf 3 zeichen kürzen */ printf("\n\n"); highscore_einfuegen(highpl,punkte,name); WriteCoded(highpl); highscore_schreiben(highpl); } } void highscore_ausgeben (void) { struct highpl highpl[8]; int i; highscore_lesen(highpl); ReadCoded(highpl); for(i=0; i<7; i++) printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); printf(" 7,5. %i Pkt\n",highpl[8].punkt); }
-
kann es sein oder finde ich da keinen unterschied?
-
Formatierung.
Gute Gelegenheit für den längsten Spam-Post 2k5
-
naja, bei mir tut der quellcode so absolut net, da sind ewig viele fehlermeldungen
-
damit das highscore-trauerspiel ein ende findet
#include <stdio.h> #include <stdlib.h> #include <string.h> struct highpl { int punkt; char name[4]; /* soll der name nur 3 zeichen lang sein, */ /* dann brauchts auch nicht mehr platz */ } highpl[8]; void verentschluesseln (unsigned char *daten, int anz) { while(anz--) daten[anz]^=0xAA; } void highscore_auf_defaults_setzen (void) { int i; for(i=0; i<8; i++) { highpl[i].punkt=0; strcpy(highpl[i].name,"---"); } } void highscore_lesen (void) { FILE *pfile; /* b in "rb" steht für binär */ /* verhindert automatische konvertierung von cr-nl nach nl */ pfile=fopen("C:\\system.zrx","rb"); if(pfile) { fread(highpl,sizeof(struct highpl),8,pfile); verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl)); fclose(pfile); } else highscore_auf_defaults_setzen(); } void highscore_schreiben (void) { FILE *pfile; pfile=fopen("C:\\system.zrx","wb"); verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl)); fwrite(highpl,sizeof(struct highpl),8,pfile); verentschluesseln((unsigned char*)highpl,8*sizeof(struct highpl)); fclose(pfile); } void highscore_einfuegen (int punkt, char *name) { int pos,i; /* bestimme position, an der der neue highscore eingefügt werden soll */ for(pos=0; pos<8; pos++) if(punkt>=highpl[pos].punkt) break; if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ /* schiebe highscores nach unten */ for(i=7; i>pos; i--) { highpl[i].punkt=highpl[i-1].punkt; strcpy(highpl[i].name,highpl[i-1].name); } /* füge neuen highscore ein */ highpl[pos].punkt=punkt; strcpy(highpl[pos].name,name); } void highscore_eingeben (int punkte) { char name[256]; highscore_lesen(); if(punkte>=highpl[7].punkt) { printf("NEUER HIGHSCORE!\n\n"); printf("Ihre Punktzahl ist: %i\n",punkte); printf("Ihr Name (max. 3 Zeichen): "); scanf("%s",name); name[3]='\0'; /* auf 3 zeichen kürzen */ printf("\n\n"); highscore_einfuegen(punkte,name); highscore_schreiben(); } } void highscore_ausgeben (void) { int i; highscore_lesen(); for(i=0; i<8; i++) printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); } void main () { highscore_ausgeben(); highscore_eingeben(1000); }
-
Konfusius schrieb:
void main ()
Na, da hat aber einer den Standard nicht aufmerksam gelesen. Das heit doch wohl bitte
int main(void)
...und am Ende das return 0; nicht vergessen.
-
0xdeadbeef schrieb:
...und am Ende das return 0; nicht vergessen.
Nirgends steht geschrieben dass main() eine return Anweisung benötigt:
3.6.1 Main function [basic.start.main]
1 A program shall contain a global function called main, which is the designated start of the program. It is
implementation-defined whether a program in a freestanding environment is required to define a main
function. [Note: in a freestanding environment, start-up and termination is implementation-defined; startup
contains the execution of constructors for objects of namespace scope with static storage duration; termination
contains the execution of destructors for objects with static storage duration. ]
2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined. All implementations
shall allow both of the following definitions of main:
int main() { /* ... / }
and
int main(int argc, char argv[]) { /* ... */ }
In the latter form argc shall be the number of arguments passed to the program from the environment in
which the program is run. If argc is nonzero these arguments shall be supplied in argv[0] through
argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (NTMBSs)
(17.3.2.1.3.2) and argv[0] shall be the pointer to the initial character of a NTMBS that represents the
name used to invoke the program or "". The value of argc shall be nonnegative. The value of
argv[argc] shall be 0. [Note: it is recommended that any further (optional) parameters be added after
argv. ]
3 The function main shall not be used (3.2) within a program. The linkage (3.5) of main is
implementation-defined. A program that declares main to be inline or static is ill-formed. The
name main is not otherwise reserved. [Example: member functions, classes, and enumerations can be
called main, as can entities in other namespaces. ]
4 Calling the function
void exit(int);
declared in <cstdlib> (18.3) terminates the program without leaving the current block and hence without
destroying any objects with automatic storage duration (12.4). If exit is called to end a program during
the destruction of an object with static storage duration, the program has undefined behavior.
5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic
storage duration) and calling exit with the return value as the argument. If control reaches the end
of main without encountering a return statement, the effect is that of executing
return 0;
-
also bei mir tuts schon so wunderbar außer das ich eben void main zu int main machen musste da ich mit dem dev-c++ arbeite.
also, muss dann noch paar kleinigkeiten für mich selber ändern, thx a lot, cya
-
@FireFlow: Warum zitierst du im C-Forum den C++-Standard?